Friday, June 5, 2009
MySql GROUP_CONCAT() tip
I wanted to get all integer ids as comma separated string to be used in other update query
my query:
SELECT GROUP_CONCAT(spm_ids) INTO @csvIds FROM someTable WHERE is_active = 1;
Whenever my select executed correctly it gave e.g. '2,5,6' as a string and when it failed it gave me '0' as a string.
before updating I checked
IF @csvIds <> 0 THEN
// perform some update on some other table
END IF;
I changed to below and my Stored procedure worked perfectly fine.
IF @csvIds <> '0' THEN
// perform some update on some other table
END IF;
Some of mysql String comparison
> select if('2' <> 0, 1, 0)
> 1
> select if('0,2' <> 0, 1, 0) //my problematic condition
> 0
> select if('0' <> 0, 1, 0)
> 0
> select if('2,5,6' <> 0, 1, 0)
> 1
MySql tip 2:
If you are writing too many Stored Procedures(SP) and also including below code in your SPs
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
SELECT 2 AS `error_code`, 'Fail to update ' AS `error_message` ;
END;
Then I would suggest that you first create your SP entirely run it many times under different conditions, if all working fine than include above code and test it again for failure.
This is because you will save some of your precious time by knowing exactly where the query failed.
Wednesday, February 11, 2009
Python Type Conversions
| Function | Description |
|---|---|
| int(x [,base]) | converts x to an integer |
| long(x [,base]) | converts x to a long integer |
| float(x) | converts x to a floating-point number |
| complex(real [,imag]) | creates a complex number |
| str(x) | converts x to a string representation |
| repr(x) | converts x to an expression string |
| eval(str) | evaluates str and returns an object |
| tuple(s) | converts a sequence object to a tuple |
| list(s) | converts a sequence object to a list |
| chr(x) | converts an integer to a character |
| unichr(x) | converts an integer to a Unicode character |
| ord(c) | converts a character to its integer value |
| hex(x) | converts an integer to a hexadecimal string |
| oct(x) | converts an integer to an octal string |
Use:
totalRings = int(userInput)
//where totalRings and userInput are variables
Friday, February 6, 2009
Clone node issue in IE
I am writing after a long time.
If you are wondering why so long?
didnt I had anything worthwhile to type?
Yes, I didnt had anything to write, coz whatever I learnt in last few months its well documented all over internet.
Not to forget an important fact that during my free time last year i Played a lot with my Canon SLR-Like Camera.
You can check my photography @ Sinless Photography
But this Time again our big time sucker IE(Internet Explorer) showed his ugly face and delayed our work and entangled us in DOM herarchies.
IE Sucks it AGAIN.
cloneNode doesnt work for all elements in IE.
yes
cloneNode doesnt work for all elements in IE.
My Problem.
I wanted to upload an image form without submitting the original form (in page1).
What I wanted to do:
1. Created a hidden form outside original form.
2. Copy / Clone input (type = file) element from original form to hidden Form.
3. Submit hidden form via JavaScript and view output in a frame (in page1).
What I did:
1. var clonedFileObject = document.forms['originalForm'].fileElement.cloneNode(true);
( where fileElement is input type = file element)
2. document.hiddenForm.appendChild(clonedFileObject);
3. hiddenForm.submit();
And What Happened.
var clonedFileObject = document.forms['originalForm'].fileElement.cloneNode(true);
Above statement worked perfectly fine in Firefox but in IE nothing happened.
No cloning was done and on form submission / image upload button All I could see was empty $_FILES array with error code = 4.
What all I tried:
1. hiddenForm.fileElement.value = originalForm.fileElement.value // didnt in FF either
2. Created a outer div and copied innerHTML of first div to hiddenforms div // didnt worked for input type file (didnt wasted much time either...should have worked)
3. Finally I did a shabby Patch work in my code which i really hated but in the given time limit and set conditions this was only I could think of.
var OriginalFileObj = document.getElementById('fileElement');
//this will remove fileElement from Original Form
var clonedFileObj = OriginalFileObj;
document.hiddenForm.appendChild(OriginalFileObj);
document.hiddenForm.submit();
divObj.appendChild(OriginalFileObj); //restoring of original file object in original form
//if you dont do this there wont be any file object in original form
I am sure there would be other better ways to do the same.
If you are aware of it please add in comments so as others can benefit from you including me.
Wednesday, August 6, 2008
Mozilla Keyboard Shortcuts
This is a list of keyboard shortcuts in Mozilla Firefox. If you have enabled Emacs-style text editing shortcuts in GNOME, they will also work in Firefox. When an Emacs text editing shortcut conflicts with the default shortcuts (as occurs with CtrlCmd+K), the Emacs shortcut will take preference if focus is inside a textbox (which would include the location bar and search bar). In such cases you should use the alternate keyboard shortcut if one is listed below.
| Command | Shortcut |
| Navigation | |
| Back | AltOpt+Left Arrow BackspaceAltOpt+Left Arrow CtrlCmd+[CtrlCmd+[ CtrlCmd+Left Arrow Delete |
| Forward | AltOpt+Right Arrow Shift+BackspaceAltOpt+Right Arrow CtrlCmd+]CtrlCmd+] CtrlCmd+Right Arrow Shift+Delete |
| Home | AltOpt+Home |
| Open File | CtrlCmd+O |
| Reload | F5 Ctrl Cmd+R |
| Reload (override cache) | CtrlCmd+F5 CtrlCmd+Shift+R |
| Stop | CtrlCmd+. Esc |
| Current Page | |
| Go to Bottom of Page | End |
| Go to Top of Page | Home |
| Move to Next Frame | F6 |
| Move to Previous Frame | Shift+F6 |
| Page Info | CtrlCmd+I |
| Page Source | CtrlCmd+U |
| CtrlCmd+P | |
| Save Page As | CtrlCmd+S |
| Text Size: Decrease | CtrlCmd+- |
| Text Size: Increase | CtrlCmd++ |
| Text Size: Restore | CtrlCmd+0 |
| Editing | |
| Copy | CtrlCmd+C |
| Cut | CtrlCmd+X |
| Delete | Delete |
| Paste | CtrlCmd+V |
| Redo | CtrlCmd+YCtrlCmd+Shift+Z |
| Select All | CtrlCmd+A |
| Undo | CtrlCmd+Z |
| Search | |
| Find | CtrlCmd+F |
| Find Again | F3 CtrlCmd+G |
| Find As You Type Link | ' |
| Find As You Type Text | / |
Open search results in new tab | Alt+Enter |
| Find Previous | Shift+F3 |
| Web Search | CtrlCmd+K CtrlCmd+E CtrlCmd +J |
| Windows & Tabs | |
| Close Tab | CtrlCmd+W Ctrl+F4 |
| Close Window | CtrlCmd+Shift+W AltOpt+F4 |
| Move Tab Left (when tab is focused) | CtrlCmd+Left Arrow CtrlCmd+Up Arrow |
| Move Tab Right (when tab is focused) | CtrlCmd+Right Arrow CtrlCmd+Down Arrow |
| Move Tab to Beginning (when tab is focused) | Ctrl Cmd+Home |
| Move Tab to End (when tab is focused) | CtrlCmd+End |
| New Tab | CtrlCmd+T |
| New Window | CtrlCmd+N |
| Next Tab | Ctrl+Tab CtrlCmd+AltOpt+Right Arrow Ctrl+Page Down |
| Open Address in New Tab (from Location Bar or Search Bar) | AltOpt+EnterReturn |
| Previous Tab | Ctrl+Shift+Tab CtrlCmd+AltOpt+Left Arrow Ctrl+Page Up |
| Undo Close Tab | CtrlCmd+Shift+T |
| Select Tab (1 to 8) | CtrlCmdAltOpt+(1 to 8) |
| Select Last Tab | CtrlCmdAltOpt+9 |
| Tools | |
| Bookmark All Tabs | CtrlCmd+Shift+D |
| Bookmark This Page | CtrlCmd+D |
| Bookmarks | CtrlCmd+B CtrlCmd+I |
| Caret Browsing | F7 |
| Downloads | CtrlCmd+JCtrlCmd+Y |
| History | CtrlCmd+H CtrlCmd+Shift+H |
| Clear Private Data | CtrlCmd+Shift+Del |
| Miscellaneous | |
| Complete .com Address | CtrlCmd+EnterReturn |
| Complete .net Address | Shift+EnterReturn |
| Complete .org Address | CtrlCmd+Shift+EnterReturn |
| Delete Selected Autocomplete Entry | DelShift+Del |
| Full Screen | F11 |
| Select Location Bar | AltOpt+D F6 CtrlCmd+L |
| Select or Manage Search Engines (when Search Bar is focused) | AltOpt+Up Arrow AltOpt+Down Arrow F4 |
| Command | Shortcut |
| Navigation | |
| Back | AltOpt+Left Arrow BackspaceAltOpt+Left Arrow CtrlCmd+[CtrlCmd+[ CtrlCmd+Left Arrow Delete |
| Forward | AltOpt+Right Arrow Shift+BackspaceAltOpt+Right Arrow CtrlCmd+]CtrlCmd+] CtrlCmd+Right Arrow Shift+Delete |
| Home | AltOpt+Home |
| Open File | CtrlCmd+O |
| Reload | F5 Ctrl Cmd+R |
| Reload (override cache) | CtrlCmd+F5 CtrlCmd+Shift+R |
| Stop | CtrlCmd+. Esc |
| Current Page | |
| Go to Bottom of Page | End |
| Go to Top of Page | Home |
| Move to Next Frame | F6 |
| Move to Previous Frame | Shift+F6 |
| Page Info | CtrlCmd+I |
| Page Source | CtrlCmd+U |
| Print | CtrlCmd+P |
| Save Page As | CtrlCmd+S |
| Zoom In | CtrlCmd++ |
| Zoom Out | CtrlCmd+- |
| Zoom Reset | CtrlCmd+0 |
| Editing | |
| Copy | CtrlCmd+C |
| Cut | CtrlCmd+X |
| Delete | Delete |
| Paste | CtrlCmd+V |
| Redo | CtrlCmd+YCtrlCmd+Shift+Z |
| Select All | CtrlCmd+A |
| Undo | CtrlCmd+Z |
| Search | |
| Find | CtrlCmd+F |
| Find Again | F3 CtrlCmd+G |
| Find As You Type Link | ' |
| Find As You Type Text | / |
| Find Previous | Shift+F3 |
| Web Search | CtrlCmd+K CtrlCmd+E Ctrl Cmd+J |
| Windows & Tabs | |
| Close Tab | CtrlCmd+W Ctrl+F4 |
| Close Window | CtrlCmd+Shift+W AltOpt+F4 |
| Move Tab Left (when tab is focused) | CtrlCmd+Left Arrow CtrlCmd+Up Arrow |
| Move Tab Right (when tab is focused) | CtrlCmd+Right Arrow CtrlCmd+Down Arrow |
| Move Tab to Beginning (when tab is focused) | Ctrl Cmd+Home |
| Move Tab to End (when tab is focused) | CtrlCmd+End |
| New Tab | CtrlCmd+T |
| New Window | CtrlCmd+N |
| Next Tab | Ctrl+Tab CtrlCmd+AltOpt+Right Arrow Cmd+} Ctrl+Page Down |
| Open Address in New Tab (from Location Bar or Search Bar) | AltOpt+EnterReturn |
| Previous Tab | Ctrl+Shift+Tab CtrlCmd+AltOpt+Left Arrow Cmd+{ Ctrl+Page Up |
| Undo Close Tab | CtrlCmd+Shift+T |
| Select Tab (1 to 8) | CtrlCmdAltOpt+(1 to 8) |
| Select Last Tab | CtrlCmdAltOpt+9 |
| Tools | |
| Bookmark All Tabs | CtrlCmd+Shift+D |
| Bookmark This Page | CtrlCmd+D |
| Bookmarks | CtrlCmd+B CtrlCmd+I |
| Caret Browsing | F7 |
| Downloads | CtrlCmd+JCtrlCmd+Y |
| History | CtrlCmd+H CtrlCmd+Shift+H |
| Clear Private Data | CtrlCmd+Shift+Del |
| Error Console | CtrlCmd+Shift+J |
| Miscellaneous | |
| Complete .com Address | CtrlCmd+EnterReturn |
| Complete .net Address | Shift+EnterReturn |
| Complete .org Address | CtrlCmd+Shift+EnterReturn |
| Delete Selected Autocomplete Entry | DelShift+Del |
| Full Screen | F11 |
| Select Location Bar | Alt+DF6 CtrlCmd+L |
| Select or Manage Search Engines (when Search Bar is focused) | AltOpt+Up Arrow AltOpt+Down Arrow F4 |
Friday, March 21, 2008
Problems with JS for...in Loop
Similar thing happen to me recently.
My webpage was full of JS errors on one fine morning.
I just could understand why..... but again google came to my rescue.
I found this article.... about dangers of using for...in loop
The Problem
Try the following code on an empty page, one without any JavaScript libraries added:
var associative_array = new Array();
associative_array["one"] = "Lorem";
associative_array["two"] = "Ipsum";
associative_array["three"] = "dolor";
for (i in associative_array) { alert(i) }; You’ll get three sequential alert boxes: “one”; “two”; “three.” This code has a predictable output and looks logically sound: you’re declaring a new array, giving it three string keys, then iterating over them.
Now do this: replace “Array” with “RegExp” and run the code again. As if by magic, this also works! It’s not the only one. Try Boolean, or Date, or String, and you’ll find they all work as well. It works because all you’re doing is setting properties on an object (in JS, foo["bar"] is the same as foo.bar), and a for..in loop simply iterates over an object’s properties. All data types in JS are objects (or have object representations), so all of them can have arbitrary properties set.
In JavaScript, one really ought to use Object for a set of key/value pairs. But because Array works as demonstrated above, JavaScript arrays (which are meant to be numeric) are often used to hold key/value pairs. This is bad practice. Object should be used instead.
I’m not trying to ridicule or scold. This misconception is too common to attribute it to stupidity, and there are many legitimate reasons for the confusion. But this is something that needs to be cleared up if JavaScript is ever to be used on a grand scale.
If you need further evidence that Array is not meant to be used this way, consider:
- There is no way to specify string keys in an array constructor.
- There is no way to specify string keys in an array literal.
- Array.length does not count them as items. In the above example,
associative_array.lengthwill return0. - The page on Arrays in the Mozilla JavaScript reference makes no mention of this usage. (Nor does the ECMAScript specification, by the way, but you’ll have to do your own legwork to verify that, because I’m not linking to page 88 of a kajillion-page PDF.)
The History
This confusion has several other contributing factors:
- In PHP, a language that many JavaScript users are also familiar with, numeric arrays and associative arrays are treated more or less identically. And since a set of key/value pairs goes by about eleven different names, depending on the language, this usage is quite often a result of unclear definitions of terms.
- JavaScript is interpreted, not compiled, and many people have learned it by example. Thus a third-party script that uses
Arrayimproperly might rub off on its users. - JavaScript started with no specification, then received a poor specification, and I know few people who spend their free time reading specifications. Especially bad ones.
- Because there is no formal construct for key/value pairs, JavaScript cannot distinguish between creating a hash and setting properties on an object. As we’ve demonstrated, any object can have arbitrary properties, and a
for..inloop simply iterates over each of these properties, so the code above is not explicitly incorrect. - The harmful side effects of using
Arrayfor key/value pairs are not experienced unlessArray.prototypeis extended. Since this is an underutilized feature of JavaScript, it hasn’t been done on a large scale until rather recently.
Why Prototype “breaks” this usage
Concurrent with Prototype’s rise in popularity have been various blog posts complaining that the JavaScript framework “breaks” associative arrays — i.e. Arrays with string keys. It “breaks” them because it adds a handful of useful methods for working with arrays to Array.prototype, and these methods are also iterated over in a for..in loop. This means that when Prototype is included on a page the code above will loop 35 times instead of the original three.
Prototype also extends String with some methods for dealing with strings. If you try to use String as an associative array, your code will loop 20 times instead of three.
I am aware of the mitigating factors — hell, I just enumerated them — but complaining that Prototype “breaks” your ability to use Array as a hash is like complaining that Prototype “breaks” your ability to use String as a hash. It is not Prototype’s fault that JavaScript does not deter this improper use, and it certainly does not mean that Prototype does not “play well with others.” You are free to reject Prototype and keep using Array improperly, but then you give up your right to bitch and moan.
Actually, we’ve been here before: before version 1.4, Prototype added a couple methods onto Object.prototype, meaning that Object couldn’t even be used in the manner I describe, and a bunch of people rightly took Sam Stephenson to task for it. Object.prototype is verboten. Since version 1.4, however, this is no longer an issue, and therefore there is no longer an excuse.
So I will say it again: Array is not meant to be used for key/value pairs. Luckily, there is a dead-simple way to fix this. In the above example, you need only change Array to Object. (Or, if you’re using literal syntax, change [] to {}.) There. Your wrong code is no longer wrong, and it took only a little more work than a simple find-and-replace.
There are plenty of JavaScript frameworks to choose from, and many of them are excellent. I use Prototype because it works for me, and I do not take it personally when other people decide they don’t like it. But I believe Prototype deserves to be hated on its merits, dammit, not because it makes wrong code stop working — especially when the wrong code can be made right in ten seconds.
Thursday, January 24, 2008
Wednesday, December 19, 2007
PHP filters
Gone are days of writing secure functions for validating URL, email address,etc.
In october 2005, first version of Filter package was released by PECL and within 1 year and 5 more releases PECL released final version 0.11 of Filter pack
age.
You can download filter package from here http://pecl.php.net/package/filter.
All you need is Php5.0 or higher and PEAR installer.
Installation steps are simple just write this in your console
$ pecl install filter
Usage Documentation.
Although filter functions are documented in php.net (http://in.php.net/filter), I find these documentation incomplete.
While doing some googling I found a good link which described different usages of Filter functions in a simple manner.
The Link is : http://phpro.org/tutorials/Filtering-Data-with-PHP.html
I won't provide you with entire usage as it would be a waste of time when I already have good link doing the same for me.
I will only provide a snapshot to show you the power of PHP filters
Filter IP Address
Following on from validation of URLs, we often find we need to validate an IP Address. Of course, and IP address may be of different formats for ipv4 and ipv6. An IP address may also need to be within a range of private or reserved ranges. The filter extension makes it possible to discern these differences and to validate an IP address to fit most needs. In its simplest form the validation of a url will look like this.
/*** an IP address ***/
$ip = "192.168.0.1";
if(filter_var($ip, FILTER_VALIDATE_IP) === FALSE)
{
echo "$ip is not a valid IP";
}
else
{
echo "$ip is valid";
}
?>
As we have supplied the above with a valid IP address it validates and all is well. But now we may wish to validate an IPV6 address or an address with a private range. The IP filter has several flag with which to validate an IP address with. Listed here.
- FILTER_FLAG_IPV4
- FILTER_FLAG_IPV6
- FILTER_FLAG_NO_PRIV_RANGE
- FILTER_FLAG_NO_RES_RANGE
Starting at the top we will check to see if an IP is a valid IPV4 address.
/*** an IP address ***/
$ip = "192.168.0";
/*** try to validate as IPV4 address ***/
if(filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4) === FALSE)
{
echo "$ip is not a valid IP";
}
else
{
echo "$ip is valid";
}
?>
Please visit the above link, read carefully and start saving time by using the above
