I have been working on ruby. Best book I have found is "Programmin Ruby" By Dave Thomas.
The language which has best documentation is "PHP" . The php manual is all what you need, I was searching something like that in ruby and 'Programming Ruby' is the gem.
Sadly I haven't found such documentation for Python.
http://docs.python.org/ is 'ok' to me but it has not been effective like 'php' or 'ruby' .
Monday, August 29, 2011
Saturday, August 27, 2011
Ruby on Rails Apache passenger defaults to production environment
I have been playing with ROR. I had been experimenting with WebRick server that comes with rails but default.
I tried to test my app with apache passenger module/mod_rails.
Passenger will assume the environment as 'production'.
On the other hand when you use rake db:migrate command it works for the 'development' environment.
If you want to use passenger for testing/development enviroment use the
rake db:migrate RAILS_ENV=production command.
or set the RailsEnv in your .conf file or in a .htaccess file(If AllowOverride is set ).
For details visit here.
http://www.modrails.com/documentation/Users%20guide%20Apache.html
I tried to test my app with apache passenger module/mod_rails.
Passenger will assume the environment as 'production'.
On the other hand when you use rake db:migrate command it works for the 'development' environment.
If you want to use passenger for testing/development enviroment use the
rake db:migrate RAILS_ENV=production command.
or set the RailsEnv in your .conf file or in a .htaccess file(If AllowOverride is set ).
For details visit here.
http://www.modrails.com/documentation/Users%20guide%20Apache.html
Saturday, August 20, 2011
javascript IE compatibility
I was pulling my hair off today when Nothing seemed to work at IE. After Some careful debuggin got out of it.
'class' is reserved at IE, MIDORi will not validate the script.
'class' is reserved at IE, MIDORi will not validate the script.
Sunday, June 12, 2011
Godaddy
I have been using GoDaddy for two months now. This is the time to make a review of their service. What I like about GoDadday is domain name registration service. They will tempt you to shop more by offering discount. They have a fine dns manager, which I had used to configure appengine.
I don't like the hosting service of godaddy, Sometimes the server was really slow especially the cpanel. I have been using hostgator and I like their service.
I don't like the hosting service of godaddy, Sometimes the server was really slow especially the cpanel. I have been using hostgator and I like their service.
Labels:
Hosting service
Tuesday, May 31, 2011
Ubuntu Recovering Boot menu after installing Windows
For Ubuntu 9.10 or later:
If you have installed windows OS after installing ubuntu and windows has deleted the mbr(Master Boot Record) you can't see the ubuntu at your boot menu, Try this solution.
Boot from a Ubuntu CD and select Try Ubuntu
First Step: Just checking the Hard Disk
Open a Terminal,Type in:
If you are Using only one Hard Disk, Your Boot record will be in that disk But if you are using two or more and mark the Hard Disk that you have selected to boot first from your Bios Settings.
If you are using one HD your device is - /dev/sda
we will continue assuming your device id is /dev/sda .
Second Step:
Now You have to mount the drive that your Ubuntu was installed previously.
Mount the drive By selecting it from the 'places' menu. It has been mounted at your /media folder(Live CD)
Check the folder name and copy the folder name. You can do it also By dragging any file/folder from the mounted drive.
Now at Terminal:
grub-install is suggested now rather than grub-setup
Try this first:
Or try this:
Replace The 'FolderName' with the Folder you have found at your /media folder.
Third Step:
Restart Your machine and the boot menu should be there but you will be missing the windows boot menu entry there . So after logging in Open a Terminal and Type:
It's Done! It'll show you a message if it finds a boot record for the windows.
There is a detailed description at http://help.ubuntu.com/community/Grub2
If you have installed windows OS after installing ubuntu and windows has deleted the mbr(Master Boot Record) you can't see the ubuntu at your boot menu, Try this solution.
Boot from a Ubuntu CD and select Try Ubuntu
First Step: Just checking the Hard Disk
Open a Terminal,Type in:
sudo fdisk -l
If you are Using only one Hard Disk, Your Boot record will be in that disk But if you are using two or more and mark the Hard Disk that you have selected to boot first from your Bios Settings.
If you are using one HD your device is - /dev/sda
we will continue assuming your device id is /dev/sda .
Second Step:
Now You have to mount the drive that your Ubuntu was installed previously.
Mount the drive By selecting it from the 'places' menu. It has been mounted at your /media folder(Live CD)
Check the folder name and copy the folder name. You can do it also By dragging any file/folder from the mounted drive.
Now at Terminal:
grub-install is suggested now rather than grub-setup
Try this first:
sudo grub-install --boot-directory=/media/FolderName/boot /dev/sda
Or try this:
sudo grub-setup -d /media/FolderName/boot/grub /dev/sda
Replace The 'FolderName' with the Folder you have found at your /media folder.
Third Step:
Restart Your machine and the boot menu should be there but you will be missing the windows boot menu entry there . So after logging in Open a Terminal and Type:
sudo update-grub
It's Done! It'll show you a message if it finds a boot record for the windows.
If you get any error you check the following link.
There is a detailed description at http://help.ubuntu.com/community/Grub2
Labels:
ubuntu
Monday, May 30, 2011
Simple Python HTML,XML DOM Parser
This parser is intended to be simple and easy to use. You can download a copy from github . The parser can detect the various forms of tags like id=lorem , id='lorem', id="lorem". I have been using this script for my current scraping project.
I had been using the python module minidom but it's no use for the malformed xml and html . So I wrote this script using only regular expression.
Usage:
Copy the spp.py in your working directory and import the package.
Instantiate the parser class by providing the url or xml|html string
To Get the 'id' attribute of the 'style' tag
1.spp.parser('http://www.google.com').getByTag('style').item(0).attr('id')
To get the attribute of a node whose id is 'csi'
2.spp.parser('http://www.google.com').getById('csi).attr('style')
# doc is the html or xml string you want to parse
3.spp.parser(doc).getById('test').attr('href')
To get the src of an image which is the 4th image of the document
4.spp.parser(doc).getBytag('img').item(4).attr('src')
To get the content of a node which has no child
5.spp.parser(doc).getById('test').innerText()
There are some nice parsing tools for python available.
I had been using the python module minidom but it's no use for the malformed xml and html . So I wrote this script using only regular expression.
Usage:
Copy the spp.py in your working directory and import the package.
Instantiate the parser class by providing the url or xml|html string
To Get the 'id' attribute of the 'style' tag
1.spp.parser('http://www.google.com').getByTag('style').item(0).attr('id')
To get the attribute of a node whose id is 'csi'
2.spp.parser('http://www.google.com').getById('csi).attr('style')
# doc is the html or xml string you want to parse
3.spp.parser(doc).getById('test').attr('href')
To get the src of an image which is the 4th image of the document
4.spp.parser(doc).getBytag('img').item(4).attr('src')
To get the content of a node which has no child
5.spp.parser(doc).getById('test').innerText()
There are some nice parsing tools for python available.
Saturday, May 28, 2011
PHP regex lookaround assertion: lookbehind and lookahead
Regular Expression is a mighty beast, if you can tame it Regex will be a great leverage to solve your Problems.
A Real World Example:
Regex assertion is to check if any string matches following or the preceding characters. Suppose we want to check if there is any '.mp3'or '.mp4' string in our text but we only want the value 'mp3'or 'mp4'
One solution is:
But this is ugly, we can use the lookbehind assertion to make the code simple:
What are the lookahead and lookbehind assertions? and what are the syntax?
Assertions Only check that from the current position if a string matches the following or preceding characters, It does not consume any character. 'lorum(?=ipsum)' matches 'lorum' from the text 'lorumipsum'. Note that it's not matching 'lorumipsum', it's just checking if 'ipsum' are the next characters after 'lorum'.
LookAhead Syntax:
Positive lookahead: (?=)
Negative lookahead: (?!)
LookAhead Assertion Checks if following characters matches(positive lookahead) or does not(negative lookahead) from the current position.
positive Lookahead:
The following example matches 'lorum' first then checks that if 'ipsum' is next, If the checking is successful then function returns a successful match.
Positive lookbehind:(?<=)
Negative lookbehind:(?<!)
positive Lookbehind:
This example matches 'ipsum' first then checks that if 'lorum' is previous, If the checking is successful then function returns a successful match.
Negative LookBehind:
The following example matches 'ipsum' first then checks that if 'hello' is not previous, If the checking is successful then function returns a successful match.
A Real World Example:
Regex assertion is to check if any string matches following or the preceding characters. Suppose we want to check if there is any '.mp3'or '.mp4' string in our text but we only want the value 'mp3'or 'mp4'
One solution is:
$text = 'demo.mp3, shakira.mp4,lorum ipsum'; if(preg_match_all('/\.mp3|\.mp4/', $text,$matches)): foreach($matches as $key => $match){ $matches[$key] = str_replace('.', '' ,$matches[$key]); } endif; var_dump($matches);
But this is ugly, we can use the lookbehind assertion to make the code simple:
preg_match_all('/(?<=.)mp3|mp4/', $text,$matches); var_dump($matches);
Let's Go Back: Check The Basic:
What are the lookahead and lookbehind assertions? and what are the syntax?
Assertions Only check that from the current position if a string matches the following or preceding characters, It does not consume any character. 'lorum(?=ipsum)' matches 'lorum' from the text 'lorumipsum'. Note that it's not matching 'lorumipsum', it's just checking if 'ipsum' are the next characters after 'lorum'.
LookAhead Syntax:
Positive lookahead: (?=)
Negative lookahead: (?!)
LookAhead Assertion Checks if following characters matches(positive lookahead) or does not(negative lookahead) from the current position.
positive Lookahead:
The following example matches 'lorum' first then checks that if 'ipsum' is next, If the checking is successful then function returns a successful match.
preg_match('/lorum(?=ipsum)/','lorumipsum', $match); var_dump($match);
Negative Lookahead: The following example matches 'lorum' first then checks that if 'test' is not next, If the checking is successful then function returns a successful match.
preg_match('/lorum(?!test)/','lorumipsum', $match); var_dump($match);
Look Behind Syntax:
Positive lookbehind:(?<=)
Negative lookbehind:(?<!)
positive Lookbehind:
This example matches 'ipsum' first then checks that if 'lorum' is previous, If the checking is successful then function returns a successful match.
preg_match('/(?<=lorum)ipsum/','lorumipsum', $match); var_dump($match);
******One important thing to remember: Regex engine searches from left to right but in this case as there is nothing too match before our assertion it matces ipsum first to determine the current position. Suppose we would build our regex expression by '^(?<=lorum)ipsum' then the regex engine would match the start of the line first. Then it would determine whether 'lorum' matches previous which would obviously fail as there is no character preceding 'lorum'.
Negative LookBehind:
The following example matches 'ipsum' first then checks that if 'hello' is not previous, If the checking is successful then function returns a successful match.
preg_match('/(?<!hello)ipsum/','lorumipsum', $match); var_dump($match);
Monday, May 16, 2011
JavaScript Rolling Animation Using marginTop
In My previous Post I wrote about how You can get a rolling animtaion using javascript scrollTop property. As the "scrollTop" is not a W3C recommendation we will use 'marginTop' of the style object to make a better solution.
We will set a negative value to the css margin-top property using a recursive function. This will move the div upwards gradually.Here is the sample Code.
Easy and pretty simple huh? This is just the basic, You can make awesome animations/sliding effects. This is compatible in all modern browsers. If you need more info, post a comment and I'll try to help.
****
*****
Javacript Rolling Animation Example Using margin
*******
*********
*******
*******
*********
*******
***
Free Javascript scripts
*****
Javacript Rolling Animation Example Using margin
*******
*********
*******
*******
*********
*******
***
Free Javascript scripts
We will set a negative value to the css margin-top property using a recursive function. This will move the div upwards gradually.Here is the sample Code.
d = document.getElementById('cat'); h = 0; ab = function(){ if(h == -150){ h = 0; } h--; d.style.marginTop = h+"px"; setTimeout('ab();', 10); } ab();
Easy and pretty simple huh? This is just the basic, You can make awesome animations/sliding effects. This is compatible in all modern browsers. If you need more info, post a comment and I'll try to help.
Labels:
JavaScript
Sunday, May 15, 2011
JavaScript Scrolling Animation Using scrollTop
Using only the scrollTop and scrollHeight property it is possible to create a nice scrolling effect.scrollTop and scrollHeight aren't W3C recommendation but these properties exist in all the modern browsers. I have checked it in Chromium,Firefox,IE and Midori the following script works perfectly. Let's see the effect.
The code is pretty simple. For achieving the animation effect out our div should be overflown.
Need Explanation?
scrollTop(integer) property shows that how far you have scrolled from the top. You can also set a value to scrollTop which will scroll automatically to a value specified.
we have a recursive function that sets the scrollTop property. If we reach at the bottom of our element that's when if(200+a.scrollTop==a.scrollHeight) we reset the scrollTop property.
Here is a tutorial about How you can achieve the same animation using margin.
If You need more explanation, Let me Know.
Javacript Scrolling Animation Using scrollTop property
****
*****
*******
*********
*******
***
****
*****
*******
*********
*******
***
Javacript Scrolling Animation Using scrollTop property
****
*****
*******
*********
*******
***
****
*****
*******
*********
*******
***
Javacript Scrolling Animation Using scrollTop property
The code is pretty simple. For achieving the animation effect out our div should be overflown.
a = document.getElementById('scroll'); c = 0; b = function() { if(200+a.scrollTop == a.scrollHeight) { a.scrollTop = 0; c = 0; }; c++; a.scrollTop = c; setTimeout('b()',10) } b();
Need Explanation?
scrollTop(integer) property shows that how far you have scrolled from the top. You can also set a value to scrollTop which will scroll automatically to a value specified.
we have a recursive function that sets the scrollTop property. If we reach at the bottom of our element that's when if(200+a.scrollTop==a.scrollHeight) we reset the scrollTop property.
Here is a tutorial about How you can achieve the same animation using margin.
If You need more explanation, Let me Know.
Labels:
JavaScript
Sunday, May 8, 2011
PHP Declaring Object before Defining Class
A quiz for you. is the following code snippet valid?
What about the following one?
what about the next? assuming test.php contains the hello function.
Unlike C/C++/Python The first two snippets are correct. But the third one will generate error. When you call a function or make an instance of a class the compiler searches in the same file for the definion.
$obj = new hello(); class hello{ function __construct(){ echo 'PHP '; } }
What about the following one?
hello(); function hello(){ echo 'PHP '; }
what about the next? assuming test.php contains the hello function.
hello(); include test.php;
Unlike C/C++/Python The first two snippets are correct. But the third one will generate error. When you call a function or make an instance of a class the compiler searches in the same file for the definion.
Labels:
PHP
Saturday, May 7, 2011
Django Installation with XAMPP for Linux-(LAMPP)
I use Ubuntu and XAMPP for my development works. My Xampp location is /opt/lampp.
This post is about Mysql Database connection problem in Django.
First Make sure you've installed the python-mysqldb package.
sudo apt-get install python-mysqldb
Then if you get the following error
_mysql_exceptions.OperationalError: (2002, "Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)")'
That means that mysqld can't find you mysql library location. You have to add the library path manually. /etch/ld/so/conf file maintains the extra library locations so add your library here.
sudo gedit /etc/ld.so.conf
Add your mysql library path here. In my case
/opt/lampp/lib/mysql
Now update your config by
sudo ldconfig
And that's it now you can test it by running server
Alternative:
You can also create a .conf file in the /etc/ld.so.conf.d directory and write your location in that file as the ld.co.conf file loads all the files from the directory.
This post is about Mysql Database connection problem in Django.
First Make sure you've installed the python-mysqldb package.
sudo apt-get install python-mysqldb
Then if you get the following error
_mysql_exceptions.OperationalError: (2002, "Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)")'
That means that mysqld can't find you mysql library location. You have to add the library path manually. /etch/ld/so/conf file maintains the extra library locations so add your library here.
sudo gedit /etc/ld.so.conf
Add your mysql library path here. In my case
/opt/lampp/lib/mysql
Now update your config by
sudo ldconfig
And that's it now you can test it by running server
Alternative:
You can also create a .conf file in the /etc/ld.so.conf.d directory and write your location in that file as the ld.co.conf file loads all the files from the directory.
Labels:
django
Friday, May 6, 2011
WordPress thickbox for Generated Images Solution
If you want to use Thickbox for the generated images you may get garbage values if you're using a url like http://test.com/image.php?coords=1,2,3 or http://test.com/image/ . The problem occurs when thickbox detects the url not as image. If you open the wp-includes/js/thickbox/thickbox.js file you will get a line
var urlString = /\.jpg$|\.jpeg$|\.png$|\.gif$|\.bmp$/;
Image formats or urls other than the above ones will show garbage value. The solution is to edit the thickbox.js file. Do not edit the default file. Make a copy of the file and place it at your theme directory. Another Option is to obtain thickbox.js from the jQuery thickbox page. This is better than copying the WordPress included one. I will explain it a bit later. Now first add the thickbox.js file in you theme. In your functions.php file use the following code.
Don't forget to add the thickbox css. Now edit the thickbox.js file around Line no 72. If your url contains .php :
Replace the line
var urlString = /\.jpg$|\.jpeg$|\.png$|\.gif$|\.bmp$/;
with
var urlString = /\.jpg$|\.jpeg$|\.png$|\.gif$|\.bmp|\.php$/;
Then in the line 75
Replace the line
if(urlType == '.jpg' || urlType == '.jpeg' || urlType == '.png' || urlType == '.gif'
|| urlType == '.bmp'' )
with
if(urlType == '.jpg' || urlType == '.jpeg' || urlType == '.png' || urlType == '.gif'
|| urlType == '.bmp' || urlType == '.php' )
There is another edit, From the whole script remove all the properties and method related with 'thickboxL10n' . This variable has been injected by wodpress as a localization process. If your copy is from jquery website your thickbox.js will have no variable 'thickboxL10n'. So It's a better option to get thickbox from the jQuery website.
If you copy download jquery from jquery website:
Replace all the "$(" with "jQuery(" .
Now click on your image and it should work now. If You face any problem you can comment here, I will try to solve your problem.
var urlString = /\.jpg$|\.jpeg$|\.png$|\.gif$|\.bmp$/;
Image formats or urls other than the above ones will show garbage value. The solution is to edit the thickbox.js file. Do not edit the default file. Make a copy of the file and place it at your theme directory. Another Option is to obtain thickbox.js from the jQuery thickbox page. This is better than copying the WordPress included one. I will explain it a bit later. Now first add the thickbox.js file in you theme. In your functions.php file use the following code.
add_action('wp_print_scripts' , 'add_custom_thickbox'); function add_custom_thickbox(){ wp_enqueue_script('thickbox_edit' , get_bloginfo('stylesheet_directory') . '/thickbox.js' , 'jquery' , ' ' , true); }
Don't forget to add the thickbox css. Now edit the thickbox.js file around Line no 72. If your url contains .php :
Replace the line
var urlString = /\.jpg$|\.jpeg$|\.png$|\.gif$|\.bmp$/;
with
var urlString = /\.jpg$|\.jpeg$|\.png$|\.gif$|\.bmp|\.php$/;
Then in the line 75
Replace the line
if(urlType == '.jpg' || urlType == '.jpeg' || urlType == '.png' || urlType == '.gif'
|| urlType == '.bmp'' )
with
if(urlType == '.jpg' || urlType == '.jpeg' || urlType == '.png' || urlType == '.gif'
|| urlType == '.bmp' || urlType == '.php' )
There is another edit, From the whole script remove all the properties and method related with 'thickboxL10n' . This variable has been injected by wodpress as a localization process. If your copy is from jquery website your thickbox.js will have no variable 'thickboxL10n'. So It's a better option to get thickbox from the jQuery website.
If you copy download jquery from jquery website:
Replace all the "$(" with "jQuery(" .
Now click on your image and it should work now. If You face any problem you can comment here, I will try to solve your problem.
Labels:
wordpress
Thursday, May 5, 2011
Firefox Setting Google As Default Search Engine using about:config
If Searching in the main address bar redirects you to a search engine other than Google, that means some firefox add-on is controlling your search options. You can check your add-on preferences for correcting it. There should be some option in a nice add-on but there are some add-ons which don't even ask!
So for Changing the settings type about:conifg in the address bar. about:config is a advanced settings section of firefox. If you're not sure what to do Don't change the default settings. This may make your browser unstable.
In the about:config page search for keyword.url. If you see the value of the term other than google.com click on the value to toggle vaules. when you have got google.com leave it there and test searching in your address bar and Google should be your default search enging now!
So for Changing the settings type about:conifg in the address bar. about:config is a advanced settings section of firefox. If you're not sure what to do Don't change the default settings. This may make your browser unstable.
In the about:config page search for keyword.url. If you see the value of the term other than google.com click on the value to toggle vaules. when you have got google.com leave it there and test searching in your address bar and Google should be your default search enging now!
Some Facts:
You can see the mozilla book verse typing about:mozilla
For Chrome browser There is no about:config pag. But there are some about pages which you can see by typing about:about.
about:about is not supported in mozilla firefox 3.6
Labels:
Firefox
Tuesday, May 3, 2011
JavaScript Find all Elements of an object
To find All functions and variables of a Javascript class or object you can use the following function. It's a silly little Function
You Can test the function here. Select a default Object and you will see the object elements. If You are using firefox you may seem nothing when you select the document object.
function getObj(obj){ var html = ''; for (var key in obj){ html += (key + ' -- > '+ typeof obj[key]); } return html; }
You Can test the function here. Select a default Object and you will see the object elements. If You are using firefox you may seem nothing when you select the document object.
Labels:
JavaScript
Tuesday, April 5, 2011
[SOLVED] WP-PageNavi, wp_pagenavi for custom query
WP-Pagenavi is a great plugin for paginating your WordPress Pages. Many people find it not working for custom queries like
get_posts, query_posts or for WP_Query. Today we'll solve the mystery.
Previously I edited the plugin to work for the custom queries but now the latest version has a built in feature to add your custom query object.
Suppose we make a custom query for getting some specific posts. The post ids are 1,5,8,9,10,34
You should set your posts_per_page to lower than the total page number to see the pagination. You should see the Pagination now but Wait Sailor, We are not done Yet!
You see that when you click on the second page you actually see the contents from the first page. So the solution is here.
Check your WordPress version before trying the solution
And you can use wp_pagenavi for get_posts,query_posts providing a paged value. If you're having any problem implementing, you can post your problem here. I will try to solve your problem.
get_posts, query_posts or for WP_Query. Today we'll solve the mystery.
Previously I edited the plugin to work for the custom queries but now the latest version has a built in feature to add your custom query object.
Suppose we make a custom query for getting some specific posts. The post ids are 1,5,8,9,10,34
$my_query = new WP_Query( array( 'post_in' =>array(1,5,8,9,10,34) ) ); //If the total page number > 1 we will show the pagination if($my_query->max_num_pages>1) if(function_exists('wp_pagenavi')) wp_pagenavi(array( 'query' =>$my_query )); //note how $my_query has been passed to wp_pagenavi
You should set your posts_per_page to lower than the total page number to see the pagination. You should see the Pagination now but Wait Sailor, We are not done Yet!
You see that when you click on the second page you actually see the contents from the first page. So the solution is here.
Check your WordPress version before trying the solution
//Revised code to show posts from all pages // page no from query $paged = get_query_var ('paged'); // pass the paged value to the WP_Query $my_query = new WP_Query( array( 'post__in' => array(1,5,8,9,10,34) , 'paged' => $paged ) ); //If the total page number > 1 we will show the pagination if($my_query->max_num_pages>1) if(function_exists('wp_pagenavi')) wp_pagenavi(array( 'query' =>$my_query )); //note how $my_query has been passed to wp_pagenavi
And you can use wp_pagenavi for get_posts,query_posts providing a paged value. If you're having any problem implementing, you can post your problem here. I will try to solve your problem.
Labels:
wordpress
Monday, March 28, 2011
wordpress cron wp_schedule_single event
In my previous post I wrote how to use
the wp_schedule_event. This post is about wp_schedule_single_event.
wp_schedule_single_event is for scheduling a single event but you can use it to execute a function more than once.
$timestamp is the timestamp when we want to execute our function
$hook is the hookname(a string) that we will attach our function with.
$args is optional parameter WordPress uses to make a md5 hash string to make the schedule unique
If you want to execute your function 'my_cron_function' at the timestamp= 'timestamp' follow the code
WordPress checks if an identical event is to be executed in 10 minutes, if so WordPress won't execute the current event.
if you use
see the code the the wp-includes/cron.php
the wp_schedule_event. This post is about wp_schedule_single_event.
wp_schedule_single_event is for scheduling a single event but you can use it to execute a function more than once.
wp_schedule_single_event( $timestamp, $hook, $args = array())
$timestamp is the timestamp when we want to execute our function
$hook is the hookname(a string) that we will attach our function with.
$args is optional parameter WordPress uses to make a md5 hash string to make the schedule unique
If you want to execute your function 'my_cron_function' at the timestamp= 'timestamp' follow the code
add_action('my_hook','my_cron_func'); function my_cron_func(){ //do something here } wp_schedule_single_event('timestamp', 'my_hook')you can use different timestamps with your hook 'my_hook' , but remember that
WordPress checks if an identical event is to be executed in 10 minutes, if so WordPress won't execute the current event.
if you use
wp_schedule_single_event(time(), 'my_hook') wp_schedule_single_event(time()+20, 'my_hook');WordPress will discard the second one because it's scheduled to execute to in 10 minutes of the previous identical one.
see the code the the wp-includes/cron.php
if ( $next && $next <= $timestamp + 600 ) return;Executing the function more than once using wp_schedule_single_event! if you use some dynamic value in the $timestamp you can make this execute more than once. for example If you use this code
wp_schedule_single_event(time()+60, 'my_hook')when you first activate the plugin the code schedules to execute the function 1min after the current time if any visitor visits the page if you use
wp_schedule_single_event(time(), 'my_hook')it will execute the function immediately. If you refresh your page in one minute WordPress won't execute the cron job as WordPress has set the default time interval between two cron jobs to 1 minute look for the code the wp-includes/cron.php
/* don't run if another process is currently running it or more than once every 60 sec. */ if ( $flag + 60 > $local_time ) return;so if you want any cron job to execute maximum time you can use
wp_schedule_single_event(time(), 'my_hook');another way to do this is to use
wp_schedule_event(time(),'every_minute','my_hook');you have make the 'every_minute' schedule yourself see the example Here
Labels:
wordpress
Thursday, March 24, 2011
Synchronizing Firefox and emacs
I am loving Emacs. Actually I am writing from emacs now. Synchronizing between firefox and emacs has been a piece of cake due to the "It's all text/textarea firefox add-on".
You can download the addon from here
After installing this addon go the Tools>add-ons>It's all Text! preference. In the 'editor textfield' add the emacs location. You can add any text editor executable location here.
You can add a shortuct key for opening emacs.It will save you some clicks.
how it works
The credits goes the addon. when there is a textarea in the webpage you will see a edit button created by the firefox add-on. You can open emacs by clicking on that button or you can choose in which mode you want to edit by right-clicking.
when emacs has opened up write something and save(C-xC-s) the text and see how the text has been imported the the webpage textarea automatically. You can also visualize how this code will look when you're writing by (C-cC-v)
You can download the addon from here
After installing this addon go the Tools>add-ons>It's all Text! preference. In the 'editor textfield' add the emacs location. You can add any text editor executable location here.
You can add a shortuct key for opening emacs.It will save you some clicks.
how it works
The credits goes the addon. when there is a textarea in the webpage you will see a edit button created by the firefox add-on. You can open emacs by clicking on that button or you can choose in which mode you want to edit by right-clicking.
when emacs has opened up write something and save(C-xC-s) the text and see how the text has been imported the the webpage textarea automatically. You can also visualize how this code will look when you're writing by (C-cC-v)
Labels:
emacs
Monday, March 21, 2011
WordPress cron explained
cron is a job scheduler in the unix-like operating systems that can be very helpful to automate tasks. . Webhosts provide cron service to execute scripts periodically.
It is encouraged to use the webhost cron service in most of the cases because WordPress cron is actually a psudo cron service. You might want to use the functions of WordPress in your script. In that Case you will have to load the wp-load.php file and the core WordPress functions, database classes will be available for your script.
If your host doesn't support cron, WordPress cron will be handy. You will need the WordPress cron functionalities for your plugins or for automating other tasks like auto-generating posts, sending mails, messages to users. So let's digg into the WordPress cron.
I mentioned before that WordPress cron is a "psudo cron", that means that it won't always execute the script at the real time you want. The cron job is triggered when somebody visits your website. That means if you have scheduled a function to be executed at 8am and if nobody visits your website at 8am the execution will be triggered suppost at 8:10 am when somebody has hit your site.
WordPress cron doesn't make your website slow!
May be you are thinking what if the cron-script takes a long time to be executed, will the visitors have to wait until the script is executed. Nope! How can that be possible? If you look at the wp-cron.php file you will find a line
It's a php.ini configuration that sets that if you stop loading the site/script the script won't stop executing.
If you look at the wp-includes/cron.php file you'll find a line like this
That means WordPress will wait only 0.01 second for triggering the execution then it will abort but as you have set ignore_user_abort to true the script will be executing.This functionality is a huge advantage to execute large scripts in the WordPress cron.
Now we know the basics of WordPress cron but how will we implement this beast?
Let's point out the most used cron WordPress functions:
Here $timestamp indicates the first time we want to execute the script.
$recurrence is the interval between the two execution.
$hook is the hook or tag with with we attach our cron functions, $args are some optional parameters
Let's make a plugin using the function.
what this plugin does
This plugin runs the function 'practice_cron_func' once in a hour. you
can make your own time intervals. see below in the 'what is hourly?' section.
what does the wp_next_scheduled() do?
It will take a hook as a parameter and will return the timestamp of the cron hook's next execution time
you can add these lines in the above plugin to test:
remove these lines after testing!
Why I am adding
what is 'hourly'?
If you look at the function the second parameter is the time intervalbetween the executions. 'hourly' is the WordPress defined time interval. WordPress has three defined values that you can use they are
You can add your defined values like 'every_minute', 'twice_a_hour' etc. This can be done by hooking a function to 'cron_schedules'. Follow the following procedure.
# Take a note that WordPress won't run cron jobs more than once a minute. see here for further details.
if we want to clear all the schedueled hooked with 'practice_cron_jobs'
use this code
you can view the scheduled tasks attached to our defined hook by
When you deactivate plugin clear the scheduled hook which will free many scheduled events.
Use this code:
Recently I have been working on iappsy.com I have used cron to autogenerate the posts and it's working perfectly.
Limitations: It won't execute more than once if time limit is exceeded. For example if you have scheduled a task to do every hour and if a visior comes after 10 hours you can expect there will be 10 executions but actually it doesn't happen It'll execute only once.
WordPress won't execute cron jobs more than once a minute. see here for more details.
It is encouraged to use the webhost cron service in most of the cases because WordPress cron is actually a psudo cron service. You might want to use the functions of WordPress in your script. In that Case you will have to load the wp-load.php file and the core WordPress functions, database classes will be available for your script.
require_once('wp-load.php');
If your host doesn't support cron, WordPress cron will be handy. You will need the WordPress cron functionalities for your plugins or for automating other tasks like auto-generating posts, sending mails, messages to users. So let's digg into the WordPress cron.
I mentioned before that WordPress cron is a "psudo cron", that means that it won't always execute the script at the real time you want. The cron job is triggered when somebody visits your website. That means if you have scheduled a function to be executed at 8am and if nobody visits your website at 8am the execution will be triggered suppost at 8:10 am when somebody has hit your site.
WordPress cron doesn't make your website slow!
May be you are thinking what if the cron-script takes a long time to be executed, will the visitors have to wait until the script is executed. Nope! How can that be possible? If you look at the wp-cron.php file you will find a line
ignore_user_abort(true);
It's a php.ini configuration that sets that if you stop loading the site/script the script won't stop executing.
If you look at the wp-includes/cron.php file you'll find a line like this
wp_remote_post( $cron_url, array('timeout' => 0.01, 'blocking' => false, 'sslverify' => apply_filters('https_local_ssl_verify', true)) );
That means WordPress will wait only 0.01 second for triggering the execution then it will abort but as you have set ignore_user_abort to true the script will be executing.This functionality is a huge advantage to execute large scripts in the WordPress cron.
Now we know the basics of WordPress cron but how will we implement this beast?
Let's point out the most used cron WordPress functions:
- wp_schedule_event
- wp_schedule_single_event
- wp_clear_scheduled_hook
- wp_next_scheduled
- wp_unschedule_event
- wp_get_schedule
wp_schedule_event($timestamp, $recurrence, $hook, $args);
Here $timestamp indicates the first time we want to execute the script.
$recurrence is the interval between the two execution.
$hook is the hook or tag with with we attach our cron functions, $args are some optional parameters
Let's make a plugin using the function.
<?php /* Plugin Name: cron-robot Plugin URI: http://sabirul-mostofa.blogspot.com Author: Sabirul Mostofa Version: 0.1 */ //adding the function to our hook 'practice_cron_job' add_action('practice_cron_jobs','practice_cron_func'); //calling the cron function if(!wp_next_scheduled('practice_cron_jobs')) wp_schedule_event(time(),'hourly','practice_cron_jobs'); // a function to add a option in the options table function practice_cron_func(){ if($a=get_option('practice_cron')) update_option('practice_cron',$a.'+'); else add_option('practice_cron','init_value'); } //for clearing the sceduled tasks register_deactivation_hook(__FILE__,'deactivate_cron_hook'); function deactivate_cron_hook(){ wp_clear_scheduled_hook('practice_cron_jobs'); } ?>
what this plugin does
This plugin runs the function 'practice_cron_func' once in a hour. you
can make your own time intervals. see below in the 'what is hourly?' section.
what does the wp_next_scheduled() do?
It will take a hook as a parameter and will return the timestamp of the cron hook's next execution time
you can add these lines in the above plugin to test:
echo wp_next_scheduled('practice_cron_jobs'); exit;
remove these lines after testing!
Why I am adding
if(!wp_next_scheduled('practice_cron_jobs'))This is just to make sure that you are not making the same cron job again because when you are scheduling a event by
wp_schedule_event(time(),'hourly','practice_cron_jobs');it will schedule another event attached to the hook.
what is 'hourly'?
If you look at the function the second parameter is the time intervalbetween the executions. 'hourly' is the WordPress defined time interval. WordPress has three defined values that you can use they are
- hourly
- daily
- twicedaily
You can add your defined values like 'every_minute', 'twice_a_hour' etc. This can be done by hooking a function to 'cron_schedules'. Follow the following procedure.
add_filter('cron_schedules','cron_minute'); function cron_minute($cron_schedules){ $cron_schedules['every_minute'] = array( 'interval'=> 60, 'display'=> __('every minute') ); return $cron_schedules; }
# Take a note that WordPress won't run cron jobs more than once a minute. see here for further details.
if we want to clear all the schedueled hooked with 'practice_cron_jobs'
use this code
wp_clear_scheduled_hook('practice_cron_jobs') ;It will delete the cron tasks from the wp_options table
you can view the scheduled tasks attached to our defined hook by
wp_get_schedule('practice_cron_jobs');
When you deactivate plugin clear the scheduled hook which will free many scheduled events.
Use this code:
register_deactivation_hook(__FILE__,'deactivate_cron_hook'); function deactivate_cron_hook(){ wp_clear_scheduled_hook('practice_cron_jobs'); }
Recently I have been working on iappsy.com I have used cron to autogenerate the posts and it's working perfectly.
Limitations: It won't execute more than once if time limit is exceeded. For example if you have scheduled a task to do every hour and if a visior comes after 10 hours you can expect there will be 10 executions but actually it doesn't happen It'll execute only once.
WordPress won't execute cron jobs more than once a minute. see here for more details.
Labels:
wordpress
Monday, February 7, 2011
Eclipse Xdebug installation With XAMPP LINUX
Eclipse is a great open-source and free tool to manage your programming projects.
I have been using eclipse for my java and php projects. Xdebug is an awesome debugging tool you can use with eclipse to debug your php code.
I assume you are using xampp linux and you have set the server at /opt/lampp location.
Requiremnts:
eclipse classic/eclipse for php developers installation 3.6.1.
At first we shall install xdebug as an extension of php
1. Download the source code from http://www.xdebug.org/
2.unzip the tar file and move in to the directory.
Now we will use the phpize utility in your /opt/lampp/bin/phpize location
if it shows error like "segmentation fault", Run in the terminal sudo apt-get install php-dev
Xdebug website has an amazing insturction page. check it here
http://www.xdebug.org/docs/install
Don't forget to check the following wizard:
http://www.xdebug.org/find-binary.php
After following the instruction you will have installed xdebug which you can check by the phpinfo();
I have been using eclipse for my java and php projects. Xdebug is an awesome debugging tool you can use with eclipse to debug your php code.
I assume you are using xampp linux and you have set the server at /opt/lampp location.
Requiremnts:
eclipse classic/eclipse for php developers installation 3.6.1.
At first we shall install xdebug as an extension of php
1. Download the source code from http://www.xdebug.org/
2.unzip the tar file and move in to the directory.
Now we will use the phpize utility in your /opt/lampp/bin/phpize location
if it shows error like "segmentation fault", Run in the terminal sudo apt-get install php-dev
Xdebug website has an amazing insturction page. check it here
http://www.xdebug.org/docs/install
Don't forget to check the following wizard:
http://www.xdebug.org/find-binary.php
After following the instruction you will have installed xdebug which you can check by the phpinfo();
Configuration at Eclipse:
Go to window>preferences>php
Set you php executable path first (e.g. /opt/lampp/bin/php)
Then configure the debug section. Select the php debugger as Xdebug.
You are almost done!
*********
Now Go to Run>Debug configuration
make sure you have selected xdebug. Now you're ready to bite the bugs .Hope this helps. Enjoy!
Subscribe to:
Posts (Atom)
About Me
- sabbir
- Web Developer From Dhaka, Bangladesh.