examples of thesis statements
Sponsored Links
Sponsored Links
Secleted [ 0 ] software to compare
Results 1 - 15 of about 3643
Regular Statement String 2.5.7
Regular Statement String (RSS) provides several libraries in C, Java, and COM. more>>
Regular Statement String (RSS) provides several libraries in C, Java, and COM to implement and demonstrate the key-value development method using well-designed "strings" (RSS) as the media. Regular Statement String also shows a way to write "Process Oriented" applications.
Enhancements:
- This release adds an implementation for SUN Solaris (SPARC).
<<lessEnhancements:
- This release adds an implementation for SUN Solaris (SPARC).
Download (0.33MB)
Added: 2007-04-12 License: Freeware Price:
926 downloads
makepp_statements 1.50-cvs-070506
makepp_statements Perl package contains various statements in a makefile. more>>
makepp_statements Perl package contains various statements in a makefile.
and, build_cache, "build_check", define, else, enddef, endef, endif, "export", global, ifdef, "ifeq", "ifmakeperl", ifndef, ifneq, ifnsys, "ifperl", "ifsys", "include", "_include", load_makefile, make, perl, "makesub", no_implicit_load, or, perl, "perl_begin", perl_end, "prebuild", register_scanner, "register_command_parser", "register_input_suffix", repository, "runtime", signature, "sub"
A statement is any line beginning with a word which does not have a : in it. (A colon implies that the line is a rule.) For example, these are statements:
include extra_rules.mk
load_makefile subdir
Makepp has a number of builtin statements which you may occasionally need to use.
Note that wherever you see an underscore, you may also use a dash, because makepp converts dashes to underscores in statement names.
Conditionals
Conditionals are special statements, which control what lines of the Makeppfile are actually seen. The simplest form (where ifxxx stands for any of the conditional statements documented below) is:
ifxxx ...
lines seen if the statement evaluates as true
endif
or:
ifxxx ...
lines seen if the statement evaluates as true
else
lines seen if the statement evaluates as false
endif
There is also the possibility to do complex combinations like this:
ifxxx ...
and ifxxx ...
and ifxxx ...
or ifxxx ...
and ifxxx ...
lines seen if the combined statements evaluate as true
else ifxxx ...
or ifxxx ...
and ifxxx ...
lines seen if the first combination evaluates as false
and these combined statements evaluate as true
else
lines seen if the statements above evaluate as false
endif
As is suggested by the indentation, and has higher precedence than or. In other words an or elects between two groups of and`s. There may be any number of and ifxxx`s, or ifxxx`s and else ifxxx`s.
<<lessand, build_cache, "build_check", define, else, enddef, endef, endif, "export", global, ifdef, "ifeq", "ifmakeperl", ifndef, ifneq, ifnsys, "ifperl", "ifsys", "include", "_include", load_makefile, make, perl, "makesub", no_implicit_load, or, perl, "perl_begin", perl_end, "prebuild", register_scanner, "register_command_parser", "register_input_suffix", repository, "runtime", signature, "sub"
A statement is any line beginning with a word which does not have a : in it. (A colon implies that the line is a rule.) For example, these are statements:
include extra_rules.mk
load_makefile subdir
Makepp has a number of builtin statements which you may occasionally need to use.
Note that wherever you see an underscore, you may also use a dash, because makepp converts dashes to underscores in statement names.
Conditionals
Conditionals are special statements, which control what lines of the Makeppfile are actually seen. The simplest form (where ifxxx stands for any of the conditional statements documented below) is:
ifxxx ...
lines seen if the statement evaluates as true
endif
or:
ifxxx ...
lines seen if the statement evaluates as true
else
lines seen if the statement evaluates as false
endif
There is also the possibility to do complex combinations like this:
ifxxx ...
and ifxxx ...
and ifxxx ...
or ifxxx ...
and ifxxx ...
lines seen if the combined statements evaluate as true
else ifxxx ...
or ifxxx ...
and ifxxx ...
lines seen if the first combination evaluates as false
and these combined statements evaluate as true
else
lines seen if the statements above evaluate as false
endif
As is suggested by the indentation, and has higher precedence than or. In other words an or elects between two groups of and`s. There may be any number of and ifxxx`s, or ifxxx`s and else ifxxx`s.
Download (0.58MB)
Added: 2007-05-30 License: Perl Artistic License Price:
877 downloads
SQL::Statement::Embed 1.15
SQL::Statement::Embed can embed a SQL engine in a DBD or module. more>>
SQL::Statement::Embed can embed a SQL engine in a DBD or module.
SQL::Statement is designed to be easy to embed in other modules and to be especially easy to embed in DBI drivers. It provides a SQL Engine and the other module needs to then provide a data source and a storage mechanism. For example, the DBD::CSV module uses SQL::Statement as an embedded SQL engine by implementing a file-based data source and by using DBI as the user interface. Similarly DBD::Amazon uses SQL::Statement as its SQL engine, provides its own extensions to the supported SQL syntax, and uses on-the-fly searches of Amazon.com as its data source.
SQL::Statement is the basis for eight existing DBDs (DBI database drivers). If you have a new data source, you too can create a DBD without having to reinvent the SQL wheel. Its fun, its easy, become a DBD author today!
SQL::Statement can be also be embedded without DBI. Well explore that first since developing a DBD uses most of the same methods and techniques.
The role of SQL::Statement subclasses
SQL::Statement provides a SQL parsing and execution engine. It does not provide a data source or storage mechanism other than in-memory tables. The DBD::File module is a subclass of SQL::Statement that provides access to file-based storage mechanisms. Its quite possible to use things other than files as data souces, in which case we wouldnt use DBD::File, instead wed replace DBD::Files methods with our own. In the examples below, well use DBD::File, replacing only a few methods.
SQL::Statement provides SQL parsing and evaluation and DBD::File provides file-based storage. The only thing missing is a data source - what we actually want to store and query. As an example suppose we are going to create a subclass called Foo that will provide as a data source a simple file similar to a passwd file - one record per line, fields separated by colons, with only three fields "username, uid, gid".
Consider what needs to happen to perform a SELECT query on our Foo data:
* recieve a SQL string
* parse the SQL string into a request structure
* open the table(s) specified in the request
* define column names and postions for the table
* read rows from the table
* convert the rows from colon-separated format into perl arrays
* match the columns and rows against the requested selection criteria
* return requested rows and columns to the user
To perform operations like INSERT and DELETE, we also need to:
* convert rows from perl arrays into colon-separated format
* write rows
* delete rows
SQL::Statement takes care of all of the SQL parsing and evaluation. DBD::File takes care of file opening, reading, writing, and deleting. So the only things Foo is really responsible for are:
* define column names and postions for the table
* convert rows from colon-separated format into perl arrays
* convert rows from perl arrays into colon-separated format
In SQL::Statement subclasses these responsibilities are assigned to two objects, a ::Statement object is responsible for opening the table, defining the column names and positions, and for creating new ::Table objects. A ::Table object is responsible for reading, converting, writing, and deleting data.
<<lessSQL::Statement is designed to be easy to embed in other modules and to be especially easy to embed in DBI drivers. It provides a SQL Engine and the other module needs to then provide a data source and a storage mechanism. For example, the DBD::CSV module uses SQL::Statement as an embedded SQL engine by implementing a file-based data source and by using DBI as the user interface. Similarly DBD::Amazon uses SQL::Statement as its SQL engine, provides its own extensions to the supported SQL syntax, and uses on-the-fly searches of Amazon.com as its data source.
SQL::Statement is the basis for eight existing DBDs (DBI database drivers). If you have a new data source, you too can create a DBD without having to reinvent the SQL wheel. Its fun, its easy, become a DBD author today!
SQL::Statement can be also be embedded without DBI. Well explore that first since developing a DBD uses most of the same methods and techniques.
The role of SQL::Statement subclasses
SQL::Statement provides a SQL parsing and execution engine. It does not provide a data source or storage mechanism other than in-memory tables. The DBD::File module is a subclass of SQL::Statement that provides access to file-based storage mechanisms. Its quite possible to use things other than files as data souces, in which case we wouldnt use DBD::File, instead wed replace DBD::Files methods with our own. In the examples below, well use DBD::File, replacing only a few methods.
SQL::Statement provides SQL parsing and evaluation and DBD::File provides file-based storage. The only thing missing is a data source - what we actually want to store and query. As an example suppose we are going to create a subclass called Foo that will provide as a data source a simple file similar to a passwd file - one record per line, fields separated by colons, with only three fields "username, uid, gid".
Consider what needs to happen to perform a SELECT query on our Foo data:
* recieve a SQL string
* parse the SQL string into a request structure
* open the table(s) specified in the request
* define column names and postions for the table
* read rows from the table
* convert the rows from colon-separated format into perl arrays
* match the columns and rows against the requested selection criteria
* return requested rows and columns to the user
To perform operations like INSERT and DELETE, we also need to:
* convert rows from perl arrays into colon-separated format
* write rows
* delete rows
SQL::Statement takes care of all of the SQL parsing and evaluation. DBD::File takes care of file opening, reading, writing, and deleting. So the only things Foo is really responsible for are:
* define column names and postions for the table
* convert rows from colon-separated format into perl arrays
* convert rows from perl arrays into colon-separated format
In SQL::Statement subclasses these responsibilities are assigned to two objects, a ::Statement object is responsible for opening the table, defining the column names and positions, and for creating new ::Table objects. A ::Table object is responsible for reading, converting, writing, and deleting data.
Download (0.085MB)
Added: 2006-06-13 License: Perl Artistic License Price:
1230 downloads
GNUstep examples 1.1.0
GNUstep examples is a collection of programs that are meant to show programmers how to use GNUstep. more>>
GNUstep examples is a collection of programs that are meant to show programmers how to use GNUstep.
GNUstep examples includes a calculator, a currency converter, finger, fractal, puzzle, hostaddress, and ink (a simple editor).
Enhancements:
- Minor feature enhancements
<<lessGNUstep examples includes a calculator, a currency converter, finger, fractal, puzzle, hostaddress, and ink (a simple editor).
Enhancements:
- Minor feature enhancements
Download (0.23MB)
Added: 2006-09-13 License: GPL (GNU General Public License) Price:
1140 downloads
GCJ::Cni::Examples 0.03
GCJ::Cni::Examples is a Perl module with examples of how to use GCJs CNI interface to write Perl Modules in Java. more>>
GCJ::Cni::Examples is a Perl module with examples of how to use GCJs CNI interface to write Perl Modules in Java.
EXAMPLES
Writing Treaded modules in Java
One benefit of using GCJ is that it takes advantage of POSIX threading. This is nice since Perls threading model is, shall we say, less than ideal. Now, you could theoretically write a module in C or C++ and and use the standard POSIX library to do your threaded work for you, however, why not take advantage of the nice Threading interface that Java provides to you by default. This may also come in handy if you have a massively threaded Java library that youd like to call from Perl.
For this example assume that I want to do matrix multiplication, albeit in a very crazy manner. Therefore, I will write a Java class, Matrix, and a method, multiply, which will take another matrix to perform the operation between. Heres the crazy part, for each cell in the resulting matrix I will spawn a new thread, as an internal class, and give it a row and a column from which they will derive the result. I know this is a little wierd but the point is that Ill be spawning a lot of new threads. To multiply two 10x10 matrices we will have to spawn 100 threads (one thread per cell in the resulting 10x10 matrix). Imagine doing this in Perl, then imagine doing it in Java; natively compiled Java. Much faster and a lot less headaches.
The Java Interface/pseudocode is as follows:
public class Matrix {
public Matrix ( int numRows, int numCols ) {
...Constructor stuff...
}
public void set ( int row, int col, int val ) {
...set an element...
}
public int get ( int row, int col ) {
...get an element...
}
public Matrix multiply ( Matrix times ) {
...set it up...
for ( int i = 0; i < rows; i++ ) {
for ( int j = 0; j < times.getCols(); j++ ) {
//GO NUTS!!!!
ArrayMultiplier multiplier = new ArrayMultiplier(this, times, result, i, j);
multiplier.start();
...etc...
}
}
...wait for the threads to exit and return the new matrix...
}
public int getRows ( ) {
...get number of rows...
}
public int getCols ( ) {
...get number of columns...
}
public void print ( ) {
...print the matrix to stdout...
}
private class ArrayMultiplier extends Thread {
public ArrayMultiplier ( Matrix a, Matrix b, Matrix result, int row, int col ) {
...Construct this bad boy...
}
public void run ( ) {
int sum = 0;
for ( int i = 0; i < a.getCols(); i++ ) {
sum += (a.get(row, i) * b.get(i, col));
}
result.set(row, col, sum);
}
}
}
Now, we want to call this class from Perl. My perferred manner is through SWIG so thats what were going to use. However, you do not need to use SWIG, you can use whatever method you prefer when wrapping C++ classes. We begin by creating a C++ header file from our above class. This is done by using GCJs gcjh utility. First we need to class compile Matrix.java
gcj -C Matrix.java
Then we go ahead and create the header file:
gcjh Matrix
Easy enough. We can then extract the interface we want to have available in Perl from the generated header file and from it create a i file to be used as input to SWIG. I usually start by copying my header file to the same named file but with an i extension instead. I then remove all of the grimy C++ gruff, private methods and variables, slap a module directive on it and call it done. It wont always be this easy though. When youre done an interface file for the above class should look something like this:
%module Matrix;
typedef int jint;
class Matrix
{
public:
Matrix (jint, jint);
virtual void set (jint, jint, jint);
virtual jint get (jint, jint);
virtual ::Matrix *multiply (::Matrix *);
virtual jint getRows ();
virtual jint getCols ();
virtual void print ();
};
We then put SWIG to work and generate our C++ wrapper for Perl:
swig -perl -c++ Matrix.i
After the above command we now will see two new files in our current directory, Matrix.pm and Matrix_wrap.cxx; these correspond the module directive we gave in Matrix.i.
At this point all we have left to do is compile, and use.
gcj -c Matrix.java
gcc -c -I -include Matrix.h Matrix_wrap.cxx
gcc -shared -lgcj -lstdc++ Matrix.o Matrix_wrap.o -oMatrix.so
A simple Perl file using this module might look something like:
sub populate_matrix {
my $matrix = shift;
for ( my $i = 0; $i < $matrix->getRows(); $i++ ) {
for ( my $j = 0; $j < $matrix->getCols(); $j++ ) {
$matrix->set($i, $j, $i * $j);
}
}
}
use GCJ::Cni;
use Matrix;
GCJ::Cni::JvCreateJavaVM(undef);
GCJ::Cni::JvAttachCurrentThread(undef, undef);
my $matrix = new Matrix::Matrix(10, 10);
populate_matrix($matrix);
my $matrix2 = new Matrix::Matrix(10, 10);
populate_matrix($matrix2);
$matrix3 = $matrix->multiply($matrix2);
$matrix3->print();
GCJ::Cni::JvDetachCurrentThread();
Ill leave it up to the reader to write a Perl module that does the same thing, that is, spawns 100 threads. In my own personal fiddling I found that just spawning that many threads (never mind doing any kind of work) was over 3 time slower in Perl. In this situation we at least get to use our favorite language, Perl, and offload some of the heavy hitting to a language more suited for it.
Where this really comes in handy is when you have an existing multi-threaded Java library that you would like to expose to Perl. You could theoretically natively compile various components of your library and then generate Perl bindings to access it. In this way, you get a little extra speed and efficiency as well as code reuse and binding.
<<lessEXAMPLES
Writing Treaded modules in Java
One benefit of using GCJ is that it takes advantage of POSIX threading. This is nice since Perls threading model is, shall we say, less than ideal. Now, you could theoretically write a module in C or C++ and and use the standard POSIX library to do your threaded work for you, however, why not take advantage of the nice Threading interface that Java provides to you by default. This may also come in handy if you have a massively threaded Java library that youd like to call from Perl.
For this example assume that I want to do matrix multiplication, albeit in a very crazy manner. Therefore, I will write a Java class, Matrix, and a method, multiply, which will take another matrix to perform the operation between. Heres the crazy part, for each cell in the resulting matrix I will spawn a new thread, as an internal class, and give it a row and a column from which they will derive the result. I know this is a little wierd but the point is that Ill be spawning a lot of new threads. To multiply two 10x10 matrices we will have to spawn 100 threads (one thread per cell in the resulting 10x10 matrix). Imagine doing this in Perl, then imagine doing it in Java; natively compiled Java. Much faster and a lot less headaches.
The Java Interface/pseudocode is as follows:
public class Matrix {
public Matrix ( int numRows, int numCols ) {
...Constructor stuff...
}
public void set ( int row, int col, int val ) {
...set an element...
}
public int get ( int row, int col ) {
...get an element...
}
public Matrix multiply ( Matrix times ) {
...set it up...
for ( int i = 0; i < rows; i++ ) {
for ( int j = 0; j < times.getCols(); j++ ) {
//GO NUTS!!!!
ArrayMultiplier multiplier = new ArrayMultiplier(this, times, result, i, j);
multiplier.start();
...etc...
}
}
...wait for the threads to exit and return the new matrix...
}
public int getRows ( ) {
...get number of rows...
}
public int getCols ( ) {
...get number of columns...
}
public void print ( ) {
...print the matrix to stdout...
}
private class ArrayMultiplier extends Thread {
public ArrayMultiplier ( Matrix a, Matrix b, Matrix result, int row, int col ) {
...Construct this bad boy...
}
public void run ( ) {
int sum = 0;
for ( int i = 0; i < a.getCols(); i++ ) {
sum += (a.get(row, i) * b.get(i, col));
}
result.set(row, col, sum);
}
}
}
Now, we want to call this class from Perl. My perferred manner is through SWIG so thats what were going to use. However, you do not need to use SWIG, you can use whatever method you prefer when wrapping C++ classes. We begin by creating a C++ header file from our above class. This is done by using GCJs gcjh utility. First we need to class compile Matrix.java
gcj -C Matrix.java
Then we go ahead and create the header file:
gcjh Matrix
Easy enough. We can then extract the interface we want to have available in Perl from the generated header file and from it create a i file to be used as input to SWIG. I usually start by copying my header file to the same named file but with an i extension instead. I then remove all of the grimy C++ gruff, private methods and variables, slap a module directive on it and call it done. It wont always be this easy though. When youre done an interface file for the above class should look something like this:
%module Matrix;
typedef int jint;
class Matrix
{
public:
Matrix (jint, jint);
virtual void set (jint, jint, jint);
virtual jint get (jint, jint);
virtual ::Matrix *multiply (::Matrix *);
virtual jint getRows ();
virtual jint getCols ();
virtual void print ();
};
We then put SWIG to work and generate our C++ wrapper for Perl:
swig -perl -c++ Matrix.i
After the above command we now will see two new files in our current directory, Matrix.pm and Matrix_wrap.cxx; these correspond the module directive we gave in Matrix.i.
At this point all we have left to do is compile, and use.
gcj -c Matrix.java
gcc -c -I -include Matrix.h Matrix_wrap.cxx
gcc -shared -lgcj -lstdc++ Matrix.o Matrix_wrap.o -oMatrix.so
A simple Perl file using this module might look something like:
sub populate_matrix {
my $matrix = shift;
for ( my $i = 0; $i < $matrix->getRows(); $i++ ) {
for ( my $j = 0; $j < $matrix->getCols(); $j++ ) {
$matrix->set($i, $j, $i * $j);
}
}
}
use GCJ::Cni;
use Matrix;
GCJ::Cni::JvCreateJavaVM(undef);
GCJ::Cni::JvAttachCurrentThread(undef, undef);
my $matrix = new Matrix::Matrix(10, 10);
populate_matrix($matrix);
my $matrix2 = new Matrix::Matrix(10, 10);
populate_matrix($matrix2);
$matrix3 = $matrix->multiply($matrix2);
$matrix3->print();
GCJ::Cni::JvDetachCurrentThread();
Ill leave it up to the reader to write a Perl module that does the same thing, that is, spawns 100 threads. In my own personal fiddling I found that just spawning that many threads (never mind doing any kind of work) was over 3 time slower in Perl. In this situation we at least get to use our favorite language, Perl, and offload some of the heavy hitting to a language more suited for it.
Where this really comes in handy is when you have an existing multi-threaded Java library that you would like to expose to Perl. You could theoretically natively compile various components of your library and then generate Perl bindings to access it. In this way, you get a little extra speed and efficiency as well as code reuse and binding.
Download (0.020MB)
Added: 2007-06-04 License: Perl Artistic License Price:
877 downloads
PostgresPy Proboscis 0.1
PostgresPy Proboscis is a pure Python driver/interface for PostgreSQL. more>>
Proboscis is a pure Python driver/interface for PostgreSQL.
It is designed to give maximum flexibility to a user by providing protocol-level prepared statements and cursors.
It features basic SSL support, COPY TO/FROM, automatic encoding/decoding, and much more.
<<lessIt is designed to give maximum flexibility to a user by providing protocol-level prepared statements and cursors.
It features basic SSL support, COPY TO/FROM, automatic encoding/decoding, and much more.
Download (0.053MB)
Added: 2005-09-28 License: Python License Price:
1486 downloads
DBIx::Simple::Examples 1.30
DBIx::Simple provides a simplified interface to DBI, Perls powerful database module. more>>
[COPRIGHT=1]
EXAMPLES
General
#!/usr/bin/perl -w
use strict;
use DBIx::Simple;
# Instant database with DBD::SQLite
my $db = DBIx::Simple->connect(dbi:SQLite:dbname=file.dat)
or die DBIx::Simple->error;
# Connecting to a MySQL database
my $db = DBIx::Simple->connect(
DBI:mysql:database=test, # DBI source specification
test, test, # Username and password
{ RaiseError => 1 } # Additional options
);
# Using an existing database handle
my $db = DBIx::Simple->connect($dbh);
# Abstracted example: $db->query($query, @variables)->what_you_want;
$db->commit or die $db->error;
Simple Queries
$db->query(DELETE FROM foo WHERE id = ?, $id) or die $db->error;
for (1..100) {
$db->query(
INSERT INTO randomvalues VALUES (?, ?),
int rand(10),
int rand(10)
) or die $db->error;
}
$db->query(
INSERT INTO sometable VALUES (??),
$first, $second, $third, $fourth, $fifth, $sixth
);
# (??) is expanded to (?, ?, ?, ?, ?, ?) automatically
Single row queries
my ($two) = $db->query(SELECT 1 + 1)->list;
my ($three, $four) = $db->query(SELECT 3, 2 + 2)->list;
my ($name, $email) = $db->query(
SELECT name, email FROM people WHERE email = ? LIMIT 1,
$mail
)->list;
Or, more efficiently:
$db->query(SELECT 1 + 1)->into(my $two);
$db->query(SELECT 3, 2 + 2)->into(my ($three, $four));
$db->query(
SELECT name, email FROM people WHERE email = ? LIMIT 1,
$mail
)->into(my ($name, $email));
<<lessEXAMPLES
General
#!/usr/bin/perl -w
use strict;
use DBIx::Simple;
# Instant database with DBD::SQLite
my $db = DBIx::Simple->connect(dbi:SQLite:dbname=file.dat)
or die DBIx::Simple->error;
# Connecting to a MySQL database
my $db = DBIx::Simple->connect(
DBI:mysql:database=test, # DBI source specification
test, test, # Username and password
{ RaiseError => 1 } # Additional options
);
# Using an existing database handle
my $db = DBIx::Simple->connect($dbh);
# Abstracted example: $db->query($query, @variables)->what_you_want;
$db->commit or die $db->error;
Simple Queries
$db->query(DELETE FROM foo WHERE id = ?, $id) or die $db->error;
for (1..100) {
$db->query(
INSERT INTO randomvalues VALUES (?, ?),
int rand(10),
int rand(10)
) or die $db->error;
}
$db->query(
INSERT INTO sometable VALUES (??),
$first, $second, $third, $fourth, $fifth, $sixth
);
# (??) is expanded to (?, ?, ?, ?, ?, ?) automatically
Single row queries
my ($two) = $db->query(SELECT 1 + 1)->list;
my ($three, $four) = $db->query(SELECT 3, 2 + 2)->list;
my ($name, $email) = $db->query(
SELECT name, email FROM people WHERE email = ? LIMIT 1,
)->list;
Or, more efficiently:
$db->query(SELECT 1 + 1)->into(my $two);
$db->query(SELECT 3, 2 + 2)->into(my ($three, $four));
$db->query(
SELECT name, email FROM people WHERE email = ? LIMIT 1,
)->into(my ($name, $email));
Download (0.015MB)
Added: 2007-05-10 License: Public Domain Price:
897 downloads
Java::Import::Examples 0.03
Java::Import::Examples is an example of how to use Java::Import to call into Java classes. more>>
Java::Import::Examples is an example of how to use Java::Import to call into Java classes.
Making RMI calls from Perl
One nice thing about Java is the extremely straight forward manner in which it allows you to make calls to remote objects residing on distant servers. Many people use this ability as a point of integration between their system and a posible third party or legacy system. Unfortunatly, for the most part the ability to make calls to these remote objects is something that only other Java applications can do without making a big fuss about it. However, we can now do this from Perl.
Assume that I have a RMI server from which I can get data from in the form of simple Java Beans. One method of doing this is to use the GCJ::Cni library and natively compile and wrap a set of Java Classes which can then be used from my Perl script. However, there is an easier way.
Lets begin by descriping the Java interfaces that well be working with. We first have the Remote Interface that we will be interacting with:
import java.rmi.*;
public interface RemoteInterface extends Remote {
public SomeBean getMessage(String seedMessage) throws RemoteException;
}
And we also have the bean we will be asking for:
import java.io.*;
public class SomeBean implements Serializable {
private String value;
public SomeBean() {}
public void setValue ( String _value ) { ... }
public String getValue ( ) { ... }
}
As far as any Perl client program is concerned this is all we need to know about.
Now all there is left to do is write a client:
use Java::Import qw(
java.rmi.Naming
);
my $remote_interface = java::rmi::Naming->lookup(jstring("//localhost/Home"));
my $bean = $remote_interface->getMessage(jstring("Hi there"));
print $bean->getValue(), "n";
Thats all there is. Notice that all we had to tell Java::Import about was java.rmi.Naming, this is because it was the only class we used by name in our Perl code, every other Java class (the objects held by $bean and $remote_interface) was returned by some other method call originating from java.rmi.Naming.
In order to run this example we have to make sure everything is in its place. We start by compiling the client code. Assuming that we have been given a Stub class file (RemoteObject_Stub.class) we can do the following:
gcj -C SomeBean.java RemoteInterface.java
fastjar -cvf client.jar SomeBean.class RemoteInterface.class RemoteObject_Stub.class
Making sure our server is reachable we can then run the client code:
CLASSPATH=client.jar perl client.pl
Thats it, you should then see the message returned by your server.
<<lessMaking RMI calls from Perl
One nice thing about Java is the extremely straight forward manner in which it allows you to make calls to remote objects residing on distant servers. Many people use this ability as a point of integration between their system and a posible third party or legacy system. Unfortunatly, for the most part the ability to make calls to these remote objects is something that only other Java applications can do without making a big fuss about it. However, we can now do this from Perl.
Assume that I have a RMI server from which I can get data from in the form of simple Java Beans. One method of doing this is to use the GCJ::Cni library and natively compile and wrap a set of Java Classes which can then be used from my Perl script. However, there is an easier way.
Lets begin by descriping the Java interfaces that well be working with. We first have the Remote Interface that we will be interacting with:
import java.rmi.*;
public interface RemoteInterface extends Remote {
public SomeBean getMessage(String seedMessage) throws RemoteException;
}
And we also have the bean we will be asking for:
import java.io.*;
public class SomeBean implements Serializable {
private String value;
public SomeBean() {}
public void setValue ( String _value ) { ... }
public String getValue ( ) { ... }
}
As far as any Perl client program is concerned this is all we need to know about.
Now all there is left to do is write a client:
use Java::Import qw(
java.rmi.Naming
);
my $remote_interface = java::rmi::Naming->lookup(jstring("//localhost/Home"));
my $bean = $remote_interface->getMessage(jstring("Hi there"));
print $bean->getValue(), "n";
Thats all there is. Notice that all we had to tell Java::Import about was java.rmi.Naming, this is because it was the only class we used by name in our Perl code, every other Java class (the objects held by $bean and $remote_interface) was returned by some other method call originating from java.rmi.Naming.
In order to run this example we have to make sure everything is in its place. We start by compiling the client code. Assuming that we have been given a Stub class file (RemoteObject_Stub.class) we can do the following:
gcj -C SomeBean.java RemoteInterface.java
fastjar -cvf client.jar SomeBean.class RemoteInterface.class RemoteObject_Stub.class
Making sure our server is reachable we can then run the client code:
CLASSPATH=client.jar perl client.pl
Thats it, you should then see the message returned by your server.
Download (0.028MB)
Added: 2007-06-01 License: Perl Artistic License Price:
876 downloads
WWW::Mechanize::Examples 1.30
WWW::Mechanize::Examples is a Perl module with sample programs that use WWW::Mechanize. more>>
SYNOPSIS
Plenty of people have learned WWW::Mechanize, and now, you can too!
Following are user-supplied samples of WWW::Mechanize in action.
You can also look at the t/*.t files in the distribution.
Please note that these examples are not intended to do any specific task. For all I know, theyre no longer functional because the sites they hit have changed. Theyre here to give examples of how people have used WWW::Mechanize.
Note that the examples are in reverse order of my having received them, so the freshest examples are always at the top.
Starbucks Density Calculator, by Nat Torkington
Heres a pair of scripts from Nat Torkington, editor for OReilly Media and co-author of the Perl Cookbook.
Rael [Dornfest] discovered that you can easily find out how many Starbucks there are in an area by searching for "Starbucks". So I wrote a silly scraper for some old census data and came up with some Starbucks density figures. Theres no meaning to these numbers thanks to errors from using old census data coupled with false positives in Yahoo search (e.g., "Dodie Starbuck-Your Style Desgn" in Portland OR). But it was fun to waste a night on.
Here are the top twenty cities in descending order of population, with the amount of territory each Starbucks has. E.g., A New York NY Starbucks covers 1.7 square miles of ground.
New York, NY 1.7
Los Angeles, CA 1.2
Chicago, IL 1.0
Houston, TX 4.6
Philadelphia, PA 6.8
San Diego, CA 2.7
Detroit, MI 19.9
Dallas, TX 2.7
Phoenix, AZ 4.1
San Antonio, TX 12.3
San Jose, CA 1.1
Baltimore, MD 3.9
Indianapolis, IN 12.1
San Francisco, CA 0.5
Jacksonville, FL 39.9
Columbus, OH 7.3
Milwaukee, WI 5.1
Memphis, TN 15.1
Washington, DC 1.4
Boston, MA 0.5
Download (0.10MB)
Added: 2007-07-20 License: Perl Artistic License Price:
828 downloads
Pygoscelis Alpha 1
Pygoscelis provides many powerful features and abilities for easy and effective file managment. more>>
Pygoscelis is modern advanced twinpanel filemanager for GNOME Desktop environment that continues in tradition of dualpanel filemanagers started by Norton Commander.
Pygoscelis project is written purely in Python language using PyGTK and Gnome Python bindings. Pygoscelis provides many powerful features and abilities for easy and effective file managment.
User interface is clean, perfectly fit into the GNOME, tries to by HIG compliant but also keep traditional dualpanel interface.
Word Pygocelis was taken from latin and stands for common genus of penguins
Project was originaly started as part of my bachelors thesis about orthordox filemanager and its development continues as free software released under the GNU General Public License (GPL).
Main features:
- Twin panels
- Tabbed inteface
- Gnome theme MIME awares
- Searching abilities
- Mounted filesystem support
- Archive support
- FTP support (planned)
- Plugin interface (planned)
<<lessPygoscelis project is written purely in Python language using PyGTK and Gnome Python bindings. Pygoscelis provides many powerful features and abilities for easy and effective file managment.
User interface is clean, perfectly fit into the GNOME, tries to by HIG compliant but also keep traditional dualpanel interface.
Word Pygocelis was taken from latin and stands for common genus of penguins
Project was originaly started as part of my bachelors thesis about orthordox filemanager and its development continues as free software released under the GNU General Public License (GPL).
Main features:
- Twin panels
- Tabbed inteface
- Gnome theme MIME awares
- Searching abilities
- Mounted filesystem support
- Archive support
- FTP support (planned)
- Plugin interface (planned)
Download (MB)
Added: 2006-09-07 License: GPL (GNU General Public License) Price:
1146 downloads
Learn HTML By Example 1.03
Learn HTML By Example is a sweet little JavaScript / HTML program. more>>
Learn HTML By Example is a sweet little JavaScript / HTML program that allows you to see the HTML you input into on side displayed as a web page on the other.
To install the program, just download it from Web Design Factory, and upload it to your web site.
Main features:
- Easy installation. Just upload to your web site and youre done!
- Immediate feedback on testing HTML and CSS code
- Several examples of commonly used HTML and CSS elements
- No page refreshing required
- Easy to expand by adding new examples
<<lessTo install the program, just download it from Web Design Factory, and upload it to your web site.
Main features:
- Easy installation. Just upload to your web site and youre done!
- Immediate feedback on testing HTML and CSS code
- Several examples of commonly used HTML and CSS elements
- No page refreshing required
- Easy to expand by adding new examples
Download (0.008MB)
Added: 2005-12-19 License: Freeware Price:
1406 downloads
ZZEE Active SQL Backup 0.9.2
ZZEE Active SQL Backup can perform *incremental* backup of MySQL database. more>>
Since MySQL is the most popular SQL server that is used in conjunction with web sites, there was a need for incremental backup utility. ZZEE Active SQL Backup is designed for clients of web hosting companies, and can be useful to system administrators as well.
Main features:
- Can perform *incremental* backup of MySQL database
- Can perform full backup of MySQL database
- Can replicate database
- Can process SQL queries
- Can dump database structure
- Can suggest database changes needed to process incremental backup
- Can send data backed up by email
- Can transfer backed up data by FTP to other computer (if Net::FTP is installed)
- Can compress backed up data
Usage synopsis
Active SQL Backup can do incremental or full backups of MySQL database as often as needed. It is suitable both for the clients of web hosting companies who can not get access to MySQL update logs and for the host administrators. Backup syntax is:
shell> ./zmdb.pl -b
It stores backup files in BACKUP_DIR, specified in user_settings.txt, named like YYYY_MM_DD_hh_mm_ss.sql[.gz]. The backup files consist of series of SQL INSERT statements and may contain DELETE statements. The database scheme is stored in file database_name.create.sql. If gzip is available, then Active SQL Backup automatically uses it to compress stored data. The program can automatically send backed up files by email or upload to the other computer by FTP.
If the system fails, Active SQL Backup can restore the database. Restore syntax for incremental backups is:
shell> ./zmdb.pl -r
If you make full backups, restore syntax is the following:
shell> ./zmdb.pl -e < BACKUP_DIR/database_name.create.sql
shell> ./zmdb.pl -e < BACKUP_DIR/YYYY_MM_DD_hh_mm_ss.sql &
The first line is needed to restore database structure, and the second is the *most recent* data file. You may need to "gunzip" it before supplying to restore.
You can use the program to dump database structure
shell> ./zmdb.pl -s > structure_dump_file
or to process queries. The latter feature is useful if you need to process queries regularly, for example, to update membership status of the users of your online service. The syntax to execute SQL queries is:
shell> ./zmdb.pl -e < some_sql_file
Where format of some_sql_file is the same as with Mysql utility: SQL statements are separated by semicolon. Note that if you pass SELECT queries to Active SQL Backup, then no result will be returned.
Syntax summary is:
zmdb.pl [SINGLE_OPTION]
-a --advice suggest database modifications and tables_config.txt
-b --backup backup database structure and data
-e --execute execute SQL queries [from STDIN]
-h --help print this screen
-r --restore restore database structure and data
-s --structure dump database structure [to STDOUT]
<<lessMain features:
- Can perform *incremental* backup of MySQL database
- Can perform full backup of MySQL database
- Can replicate database
- Can process SQL queries
- Can dump database structure
- Can suggest database changes needed to process incremental backup
- Can send data backed up by email
- Can transfer backed up data by FTP to other computer (if Net::FTP is installed)
- Can compress backed up data
Usage synopsis
Active SQL Backup can do incremental or full backups of MySQL database as often as needed. It is suitable both for the clients of web hosting companies who can not get access to MySQL update logs and for the host administrators. Backup syntax is:
shell> ./zmdb.pl -b
It stores backup files in BACKUP_DIR, specified in user_settings.txt, named like YYYY_MM_DD_hh_mm_ss.sql[.gz]. The backup files consist of series of SQL INSERT statements and may contain DELETE statements. The database scheme is stored in file database_name.create.sql. If gzip is available, then Active SQL Backup automatically uses it to compress stored data. The program can automatically send backed up files by email or upload to the other computer by FTP.
If the system fails, Active SQL Backup can restore the database. Restore syntax for incremental backups is:
shell> ./zmdb.pl -r
If you make full backups, restore syntax is the following:
shell> ./zmdb.pl -e < BACKUP_DIR/database_name.create.sql
shell> ./zmdb.pl -e < BACKUP_DIR/YYYY_MM_DD_hh_mm_ss.sql &
The first line is needed to restore database structure, and the second is the *most recent* data file. You may need to "gunzip" it before supplying to restore.
You can use the program to dump database structure
shell> ./zmdb.pl -s > structure_dump_file
or to process queries. The latter feature is useful if you need to process queries regularly, for example, to update membership status of the users of your online service. The syntax to execute SQL queries is:
shell> ./zmdb.pl -e < some_sql_file
Where format of some_sql_file is the same as with Mysql utility: SQL statements are separated by semicolon. Note that if you pass SELECT queries to Active SQL Backup, then no result will be returned.
Syntax summary is:
zmdb.pl [SINGLE_OPTION]
-a --advice suggest database modifications and tables_config.txt
-b --backup backup database structure and data
-e --execute execute SQL queries [from STDIN]
-h --help print this screen
-r --restore restore database structure and data
-s --structure dump database structure [to STDOUT]
Download (0.027MB)
Added: 2006-03-08 License: Other/Proprietary License Price:
1325 downloads
dANN 0.1-alpha-RC2 (Examples)
dANN project is a library to help create artificial neural networks within other programs. more>>
dANN library can help create artificial neural networks within other programs. It is currently written in Java, C++, and C#. However, C++ and C# versions can only be obtained through the SVN at the moment.
Also, the C++ and C# versions are not properly documented and cleaned up, although they work. The Java version of the library is well documented and packaged in binary and source form.
The intent is to provide a powerful interface for programs to include artificial neural network technology into their code. It will also act as a testing ground for research and development of new AI concepts.
Enhancements:
- This release was updated to work with the new library layout.
<<lessAlso, the C++ and C# versions are not properly documented and cleaned up, although they work. The Java version of the library is well documented and packaged in binary and source form.
The intent is to provide a powerful interface for programs to include artificial neural network technology into their code. It will also act as a testing ground for research and development of new AI concepts.
Enhancements:
- This release was updated to work with the new library layout.
Download (0.006MB)
Added: 2006-06-03 License: GPL (GNU General Public License) Price:
1239 downloads
Locale::KeyedText 1.73.0
Locale::KeyedText is a Perl module that refer to user messages in programs by keys. more>>
Locale::KeyedText is a Perl module that refers to user messages in programs by keys.
It also describes the same-number versions of Locale::KeyedText::Message ("Message") and Locale::KeyedText::Translator ("Translator").
Note that the "Locale::KeyedText" package serves only as the name-sake representative for this whole file, which can be referenced as a unit by documentation or use statements or Perl archive indexes. Aside from use statements, you should never refer directly to "Locale::KeyedText" in your code; instead refer to other above-named packages in this file.
SYNOPSIS
use Locale::KeyedText;
main();
sub main {
# Create a translator.
my $translator = Locale::KeyedText::Translator->new({
set_names => [MyLib::Lang::, MyApp::Lang::],
# set package prefixes for localized app components
member_names => [Eng, Fr, De, Esp],
# set list of available languages in order of preference
});
# This will print Enter 2 Numbers in the first of the four
# languages that has a matching template available.
print $translator->translate_message(
Locale::KeyedText::Message->new({
msg_key => MYAPP_PROMPT }) );
# Read two numbers from the user.
my ($first, $second) = ;
# Print a statement giving the operands and their sum.
MyLib->add_two( $first, $second, $translator );
}
package MyLib; # module
sub add_two {
my (undef, $first, $second, $translator) = @_;
my $sum = $first + $second;
# This will print plus equals in
# the first possible language. For example, if the user
# inputs 3 and 4, it the output will be 3 plus 4 equals 7.
print $translator->translate_message(
Locale::KeyedText::Message->new({ msg_key => MYLIB_RESULT,
msg_vars => { FIRST => $first, SECOND => $second,
RESULT => $sum } }) );
}
Many times during a programs operation, the program (or a package it uses) will need to display a message to the user, or generate a message to be shown to the user. Sometimes this is an error message of some kind, but it could also be a prompt or response message for interactive systems.
If the program or any of its components are intended for widespread use then it needs to account for a variance of needs between its different users, such as their preferred language of communication, or their privileges regarding access to information details, or their technical skills. For example, a native French or Chinese speaker often prefers to communicate in those languages. Or, when viewing an error message, the applications developer should see more details than joe public would.
Alternately, sometimes a program will raise a condition or error that, while resembling a message that would be shown to a user, is in fact meant to be interpreted by the machine itself and not any human user. In some situations, a shared program component may raise such a condition, and one application may handle it internally, while another one displays it to the user instead.
Locale::KeyedText provides a simple but effective mechanism for applications and packages that empowers single binaries to support N locales or user types simultaneously, and that allows any end users to add support for new languages easily and without a recompile (such as by simply copying files), often even while the program is executing.
Locale::KeyedText gives your application the maximum amount of control as to what the user sees; it never outputs anything by itself to the user, but rather returns its results for calling code to output as it sees fit. It also does not make direct use of environment variables, which can aid in portability.
Practically speaking, Locale::KeyedText doesnt actually do a lot internally; it exists mainly to document a certain localization methodology in an easily accessable manner, such that would not be possible if its functionality was subsumed into a larger package that would otherwise use it. Hereafter, if any other package or application says that it uses Locale::KeyedText, that is a terse way of saying that it subscribes to the localization methodology that is described here, and hence provides these benefits to developers and users alike.
For some practical examples of Locale::KeyedText in use, see the /examples directory of this distribution. Or, see my dependent CPAN packages whose problem domain is databases and/or SQL.
<<lessIt also describes the same-number versions of Locale::KeyedText::Message ("Message") and Locale::KeyedText::Translator ("Translator").
Note that the "Locale::KeyedText" package serves only as the name-sake representative for this whole file, which can be referenced as a unit by documentation or use statements or Perl archive indexes. Aside from use statements, you should never refer directly to "Locale::KeyedText" in your code; instead refer to other above-named packages in this file.
SYNOPSIS
use Locale::KeyedText;
main();
sub main {
# Create a translator.
my $translator = Locale::KeyedText::Translator->new({
set_names => [MyLib::Lang::, MyApp::Lang::],
# set package prefixes for localized app components
member_names => [Eng, Fr, De, Esp],
# set list of available languages in order of preference
});
# This will print Enter 2 Numbers in the first of the four
# languages that has a matching template available.
print $translator->translate_message(
Locale::KeyedText::Message->new({
msg_key => MYAPP_PROMPT }) );
# Read two numbers from the user.
my ($first, $second) = ;
# Print a statement giving the operands and their sum.
MyLib->add_two( $first, $second, $translator );
}
package MyLib; # module
sub add_two {
my (undef, $first, $second, $translator) = @_;
my $sum = $first + $second;
# This will print plus equals in
# the first possible language. For example, if the user
# inputs 3 and 4, it the output will be 3 plus 4 equals 7.
print $translator->translate_message(
Locale::KeyedText::Message->new({ msg_key => MYLIB_RESULT,
msg_vars => { FIRST => $first, SECOND => $second,
RESULT => $sum } }) );
}
Many times during a programs operation, the program (or a package it uses) will need to display a message to the user, or generate a message to be shown to the user. Sometimes this is an error message of some kind, but it could also be a prompt or response message for interactive systems.
If the program or any of its components are intended for widespread use then it needs to account for a variance of needs between its different users, such as their preferred language of communication, or their privileges regarding access to information details, or their technical skills. For example, a native French or Chinese speaker often prefers to communicate in those languages. Or, when viewing an error message, the applications developer should see more details than joe public would.
Alternately, sometimes a program will raise a condition or error that, while resembling a message that would be shown to a user, is in fact meant to be interpreted by the machine itself and not any human user. In some situations, a shared program component may raise such a condition, and one application may handle it internally, while another one displays it to the user instead.
Locale::KeyedText provides a simple but effective mechanism for applications and packages that empowers single binaries to support N locales or user types simultaneously, and that allows any end users to add support for new languages easily and without a recompile (such as by simply copying files), often even while the program is executing.
Locale::KeyedText gives your application the maximum amount of control as to what the user sees; it never outputs anything by itself to the user, but rather returns its results for calling code to output as it sees fit. It also does not make direct use of environment variables, which can aid in portability.
Practically speaking, Locale::KeyedText doesnt actually do a lot internally; it exists mainly to document a certain localization methodology in an easily accessable manner, such that would not be possible if its functionality was subsumed into a larger package that would otherwise use it. Hereafter, if any other package or application says that it uses Locale::KeyedText, that is a terse way of saying that it subscribes to the localization methodology that is described here, and hence provides these benefits to developers and users alike.
For some practical examples of Locale::KeyedText in use, see the /examples directory of this distribution. Or, see my dependent CPAN packages whose problem domain is databases and/or SQL.
Download (0.035MB)
Added: 2006-09-19 License: Perl Artistic License Price:
1130 downloads
Jifty::DBI::SchemaGenerator 0.29
Jifty::DBI::SchemaGenerator is a Perl module to generate table schemas from Jifty::DBI records. more>>
Jifty::DBI::SchemaGenerator is a Perl module to generate table schemas from Jifty::DBI records.
This module turns a Jifty::Record object into an SQL schema for your chosen database. At the moment, your choices are MySQL, SQLite, or PostgreSQL. Oracle might also work right, though its untested.
SYNOPSIS
The Short Answer
See below for where we get the $handle and $model variables.
use Jifty::DBI::SchemaGenerator;
...
my $s_gen = Jifty::DBI::SchemaGenerator->new( $handle );
$s_gen->add_model($model);
my @statements = $s_gen->create_table_sql_statements;
print join("n", @statements, );
...
The Long Version
See Jifty::DBI for details about the first two parts.
MyModel
package MyModel;
# lib/MyModel.pm
use warnings;
use strict;
use base qw(Jifty::DBI::Record);
# your custom code goes here.
1;
MyModel::Schema
package MyModel::Schema;
# lib/MyModel/Schema.pm
use warnings;
use strict;
use Jifty::DBI::Schema;
column foo => type is text;
column bar => type is text;
1;
myscript.pl
#!/usr/bin/env perl
# myscript.pl
use strict;
use warnings;
use Jifty::DBI::SchemaGenerator;
use Jifty::DBI::Handle;
use MyModel;
use MyModel::Schema;
my $handle = Jifty::DBI::Handle->new();
$handle->connect(
driver => SQLite,
database => testdb,
);
my $model = MyModel->new($handle);
my $s_gen = Jifty::DBI::SchemaGenerator->new( $handle );
$s_gen->add_model($model);
# heres the basic point of this module:
my @statements = $s_gen->create_table_sql_statements;
print join("n", @statements, );
# this part is directly from Jifty::Script::Schema::create_all_tables()
$handle->begin_transaction;
for my $statement (@statements) {
my $ret = $handle->simple_query($statement);
$ret or die "error creating a table: " . $ret->error_message;
}
$handle->commit;
<<lessThis module turns a Jifty::Record object into an SQL schema for your chosen database. At the moment, your choices are MySQL, SQLite, or PostgreSQL. Oracle might also work right, though its untested.
SYNOPSIS
The Short Answer
See below for where we get the $handle and $model variables.
use Jifty::DBI::SchemaGenerator;
...
my $s_gen = Jifty::DBI::SchemaGenerator->new( $handle );
$s_gen->add_model($model);
my @statements = $s_gen->create_table_sql_statements;
print join("n", @statements, );
...
The Long Version
See Jifty::DBI for details about the first two parts.
MyModel
package MyModel;
# lib/MyModel.pm
use warnings;
use strict;
use base qw(Jifty::DBI::Record);
# your custom code goes here.
1;
MyModel::Schema
package MyModel::Schema;
# lib/MyModel/Schema.pm
use warnings;
use strict;
use Jifty::DBI::Schema;
column foo => type is text;
column bar => type is text;
1;
myscript.pl
#!/usr/bin/env perl
# myscript.pl
use strict;
use warnings;
use Jifty::DBI::SchemaGenerator;
use Jifty::DBI::Handle;
use MyModel;
use MyModel::Schema;
my $handle = Jifty::DBI::Handle->new();
$handle->connect(
driver => SQLite,
database => testdb,
);
my $model = MyModel->new($handle);
my $s_gen = Jifty::DBI::SchemaGenerator->new( $handle );
$s_gen->add_model($model);
# heres the basic point of this module:
my @statements = $s_gen->create_table_sql_statements;
print join("n", @statements, );
# this part is directly from Jifty::Script::Schema::create_all_tables()
$handle->begin_transaction;
for my $statement (@statements) {
my $ret = $handle->simple_query($statement);
$ret or die "error creating a table: " . $ret->error_message;
}
$handle->commit;
Download (0.097MB)
Added: 2007-01-17 License: Perl Artistic License Price:
1010 downloads
Secleted [ 0 ] software to compare
Copyright Notice:
Software piracy is theft, Using crack, password, serial numbers, registration codes, key generators is illegal and prevent future software development. The above examples of thesis statements search only lists software in full, demo and trial versions for free download. Download links are directly from our mirror sites or publisher sites, torrent files or links from rapidshare.com, yousendit.com or megaupload.com are not allowed