Friday, October 16, 2009

Customize ReCaptcha theme

ReCaptcha is a widely use Captcha generation web service which is owned by Google. Yesterday I had the opportunity to use ReCaptcha for one of my project. But there was a problem. Since ReCaptcha is generated to a certain style, width and height using a webservice request, it was hard to put it into the design of the form which I was trying to integrate ReCaptcha.
But finally I could solve the problem using some tricks. This is how I did it.
For using ReCaptcha, first you have to create an account ( account and service is free) in http://recaptcha.net/ and generate a public key and a private key for accessing ReCaptcha web service. You can choose two option when generating those keys, default is generated keys can only be used in provided ( when generating keys) web site. Other one is you can use generated keys in any server and you have to select the checkbox saying some global key enabling ( I can't remember it) for using this second option.
Then download the ReCaptcha library. It contains recaptchalib.php files and an example page. What do you want is recaptchalib.php. To use recaptcha, add following php codes in to the top of your php page.

require_once('recaptchalib.php');
$publickey = "your_public_key"; // get this from the signup page
$privatekey = "your_private_key";// get this from the signup page

Since you are looking for custom theme for ReCaptcha, add this javascript code to head section of the your php page.

<script type= "text/javascript">

var RecaptchaOptions = {
theme: 'custom',
lang: 'en',
custom_theme_widget: 'recaptcha_widget'
};

</script>

Value of "custom_theme_widget" which is 'recaptcha_widget' in above code is the name of the div which your recaptcha gadget will put into.
Then add a div with the above mentioned id 'recaptcha_widget' in to the place where you need your recaptcha. All other recaptcha related divs will reside in this created div. Add another div named 'recaptcha_image' inside 'recaptcha_widget' for holding the recaptcha image. You also need to add a input text field named 'recaptcha_response_field' for typing the letters in the captcha image. There are lot of other things you can put as your requirements as a link for audio recaptcha, for error messages, for refreshing recaptcha etc, and I'm not going to put all those things in my example. In addition to that, you also have to put code for getting recaptcha with your publick key (two parts of code, if javascript is disabled, there is an iframe to include).

So this is the code I finally got as ReCaptcha widget,
<div id="recaptcha_widget" style="display: none;">
<div id="recaptcha_image"></div>
<div class="recaptcha_only_if_incorrect_sol" style="color: red;">Incorrect please try again</div>
<span class="recaptcha_only_if_image">Enter the words above:</span>
<span class="recaptcha_only_if_audio">Enter the numbers you hear:</span>
<input id="recaptcha_response_field" name="recaptcha_response_field" type="text">
<strong style="font-size: 10px;"><a href="javascript:void(0);">Get another CAPTCHA</a></strong>

<!--div class="recaptcha_only_if_image"><a href="javascript:Recaptcha.switch_type('audio')">Get an audio CAPTCHA</a></div><br />
<div class="recaptcha_only_if_audio"><a href="javascript:Recaptcha.switch_type('image')">Get an image CAPTCHA</a></div><br /><br />
<div><a href="javascript:Recaptcha.showhelp()">Help</a><br />
</div-->

<script type="text/javascript" src="http://api.recaptcha.net/challenge?k=<?php echo $publickey;?>&lang=en"></script>

<noscript>
<iframe src="http://api.recaptcha.net/noscript?k=<?php echo $publickey;?>&lang=en" height="200" width="500" frameborder="0"></iframe>
<textarea name="recaptcha_challenge_field" rows="3" cols="40"></textarea>
<input type="'hidden'" name="'recaptcha_response_field'" value="'manual_challenge'">
</noscript>

</div>

I commented out some fields I did not want to use in this code. After coding to this point, there was another problem came. That is the image generated by ReCaptcha is a standarad size of 300px X 57px. By adding a little css code, I could change the size of the recaptcha image as I wanted. I added following CSS code into the head section ( between head tags) of my php page.

<style type="text/css">
div#recaptcha_image > img{
height:46px;
width:240px;
}
</style>

This is the final output of the code.

Tuesday, September 1, 2009

Use uppercase letters for mysql data table names in Windows

When we developing mysql based applications, there is a good probability to developers develop the application on Windows OS and deploy it on a linux server or vice versa. MySQL supports both lowercase and uppercase letters for table names in unix enviroments, but when it came to Windows, the default MySQL configuration does not support upper case letters in table names. This becomes a big headache if you need to restore mysql database backups from windows environments to unix environments ( other way round is not quiet a problem since all table names becomes lowercase in Windows machines) during several times while development.

Today I found a solution for this case insensitvity of table names in MySQL servers on Windows environment. There is a mysql system variable called "lower_case_table_names" and it has set to 1 in default mysql configuration for Windows. 1 means only lower case table names are supported. For gaining the support for Both lower and upper case letters in table names, what you have to do is find relevant my.ini file for your MySQL installation and add the following line to the end of the file.
lower_case_table_names=2
Then restart the MySQL server. Now you will be able to create tables with names which include both upper-case and lower-case letters.

Related MySQL articles,
http://dev.mysql.com/doc/refman/5.0/en/identifier-case-sensitivity.html
http://dev.mysql.com/doc/refman/5.0/en/server-system-variables.html#sysvar_lower_case_table_names

Saturday, July 18, 2009

Searching a MySql database for a Value to find which tables contains it.

In my recent works, I needed to do a search for a some string value to find what are the tables contains that value. Although there are easy tools and methods which allows you to search for a value in a known field and known data table, I couldn't found a easy way to search for a value in a entire MySQL database. So i wrote this simple PHP script for accomplished that task. If somebody needs such functionality, they can use the script. Please change the database host, user name, password ( and database name ) according to your requirements.

This scripts helps to search a value in an entire mysql database. In main results page, it will displays the tables which contains the search value and what are the fields which contains the search value and number of occurences of the search value. By clicking on the number of results column value in the main results table, You can go to a page which displays the rows which contains the search value in relevant database table.

Download it from
http://heidisoft.com/sites/default/files/phpmysearch.zip
or
http://rapidshare.com/files/257172086/phpmysearch.zip

Sunday, July 5, 2009

Reset passwords for XAMPP pages

When I installed XAMPP on UBUNTU OS in my laptop, I put a password for that. But unfortunately , I couldn't remember it later. So I did some search on it and found a solution for the problem.

Open a terminal and type following command,
sudo /opt/lampp/lampp security
Then it will ask for new password and no need to provide old passwords.

Wednesday, April 22, 2009

Upload a file to another webpage through a Java Servlet

In past few days, I had to work on implementing a functionality for sending an HTTP request to another url and upload a file with that HTTP request and then get the response for the HTTP request from a Java servlet. This is the code I finally created for achieving my task. It does,
  1. Connect to another given URL
  2. Upload given string as a file to the above url
  3. Then read the response for the above HTTP request.
Below function is called inside the protected void processRequest(HttpServletRequest request, HttpServletResponse response) of a Servlet in my project. I have put the relevant code for achieving this task in below.

// Import these packages
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;

// Code
private String uploadFile(String urlstring, String dataXML) {
try {
 String itemname = "formFile"; String tempfilename = "test.xml";  String lineEnd = "\r\n";  String twoHyphens = "--";
 String boundary = "---------------------------24464570528145";
 URL url = new URL(urlstring);
 HttpURLConnection connection = (HttpURLConnection)  url.openConnection();
 connection.setDoOutput(true);
 connection.setDoInput(true);

 connection.setUseCaches(false);
 


 connection.setRequestMethod("POST");

 connection.setRequestProperty("Connection", "keep-alive"); 

 connection.setRequestProperty("Content-Type", "multipart/form- data; boundary=" + boundary);
 connection.setRequestProperty("Accept-Charset", "ISO-8859-1,utf-8;q=0.7,*;q=0.7");
 


 DataOutputStream dataoutputstream = new          

     DataOutputStream(connection.getOutputStream()); 

 dataoutputstream.writeBytes(twoHyphens + boundary + lineEnd);

 dataoutputstream.writeBytes("Content-Disposition: form-data;    name=\"" + itemname + "\"; filename=\"" + tempfilename + "\"" +  lineEnd);

 dataoutputstream.writeBytes("Content-Type: text/plain" +  lineEnd + lineEnd);
 // dataXML is File data, writes a string as the file content of  the uploading
 // file
 dataoutputstream.writeBytes(dataXML);
 dataoutputstream.writeBytes(lineEnd);

 dataoutputstream.writeBytes(twoHyphens + boundary + twoHyphens +
lineEnd);


 dataoutputstream.flush();
 dataoutputstream.close();

 String inputLine;
 StringBuffer sbResponseData = new StringBuffer();


 // Get the response data for the previous HTTP request

 DataInputStream dis = new  DataInputStream(connection.getInputStream());
 while ((inputLine = dis.readLine()) != null) {
  sbResponseData.append(inputLine + "\n");
 }

 dis.close();
 return sbResponseData.toString();


 }
 catch (Exception ex) {
  logger.error("Exception in initiating outdial call request:       Details: " + ex.toString());
 }

}

Wednesday, April 15, 2009

Previewing the URL of a TinyUrl

Nowadays, many of us use TinyURL s instead of using long urls for the ease of use. Think that a site you visited has a tiny url like http://tinyurl.com/c8yvgr. We can not directly say whether this tiny url links to a good site or a porn site or a other malicious site by looking at given tiny url . But now you can preview the actual URL before visiting the target site using a feature provided by http://tinyurl.com. What you have to do is go to http://tinyurl.com/preview.php and then click on the link Click here to enable previews. After enabling that, each time you click on a tinyURL, it will first show the preview of actual url and then you can proceed as you wish. You can later disable the preview settings using the same page.

Wednesday, April 8, 2009

How to get auto generated field values (primary keys etc) after inserting a data entry to the database [ for PostgreSQL]

In these days I'm involved with a project using a PostgreSQL database. This is the first time I'm working with PGSQL, So I could learn some new features in PGSQL. One of the requirement I needed while coding is to find an easy way to get the auto generated primary key value when inserting a data record to the PGSQL database. I could find several ways to do that and one of method I found was really easy way. Those methods I found are described in this post.

First Method:
public int insertData( String name, String address, String tp_no)
{

int insertedKey = 0;
try {
Class.forName("org.postgresql.Driver");
Connection con = DriverManager.getConnection("jdbc:postgresql://localhost/MyDb", "username", "password");

// Database has a primary key named "recordId"
String insertSql = "INSERT INTO \"MyTable\" (name, address, tp_no)" + " VALUES (?, ?, ?);";
PreparedStatement pstmt = con.prepareStatement(insertSql);
pstmt.setString(1, name);
pstmt.setString(2, address);
pstmt.setString(3, tp_no);
pstmt.executeUpdate();

// each table has a sequence named "TABLENAME_PRIMARYKEY_seq"
// my table name is "MyTable" and it has the auto incremented
// primary key field called "recordId". So sequence related to
// following query is "MyTable_recordId_seq"
String getRecordIdSql = "select currval('\"MyTable_recordId_seq\"');";
Statement stmtGetRecId = con.createStatement();
ResultSet res = stmtGetRecId.executeQuery(getRecordIdSql);

if (res.first())
{
insertedKey = res.getInt(1);
}

con.close();

}
catch (Exception e)
{
System.out.println("Exception occurred: Details: " + e.getLocalizedMessage());
}

return insertedKey;

}

Second & Easy Method:

public int insertData( String name, String address, String tp_no)
{

int insertedKey = 0;
try {
Class.forName("org.postgresql.Driver");
Connection con = DriverManager.getConnection("jdbc:postgresql://localhost/MyDb", "username", "password");
// See the end of the query string
// Database has a primary key named "recordId"
String insertSql = "INSERT INTO \"MyTable\" (name, address, tp_no)" + " VALUES (?, ?, ?) RETURNING recordId;";
PreparedStatement pstmt = con.prepareStatement(insertSql, ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);
pstmt.setString(1, name);
pstmt.setString(2, address);
pstmt.setString(3, tp_no);
ResultSet res = pstmt.executeQuery();
// Get record id of the newly inserted record
if (res.first()) {
insertedKey = res.getInt(1);
}
res.close();
con.close();
} catch (Exception e) {
// logging
System.out.println("Exception occurred: Details: " + e.getLocalizedMessage());
}
return insertedKey;

}

Another Method:
I found later an another way to get the generated keys using JDBC, but I didn't have time to test that. But you can find an example to that method in this article http://www.java-tips.org/other-api-tips/jdbc/how-to-get-auto-generated-keys-from-java-class-3.html

Wednesday, April 1, 2009

Show hidden files even when computer is infected by a virus

You can show the hidden files by changing this entry even in a machine infected by a virus. There is another place in the registry that can use to show/hide hidden files, but when the computer is infected by a virus, it doesn't work. This method still works in this situation.
+HKEY_LOCAL_MACHINE
+SOFTWARE
+Microsoft
+Windows
+CurrentVersion
+Explorer
+Advanced
+Folder
+Hidden
NOHIDDEN
In the NOHIDDEN folder, select CheckedValue and set value to 1.