The tinyurl service takes a long URL string (which can be a site address or a document available online) and return back a permanent shortcut pointing the original source url. For example
http://google.com generates http://tinyurl.com/2tx
or
http://mail.yahoo.com generates http://tinyurl.com/6dg
or
http://tinyurl.com/5zv5vm
or
http://gilby.com generated http://tinyurl.com/1
Now the question is, how the service creates a new shortcut for all those uncountable number of available? What algorithm is working behind? Is it compressed URL form? Or is it saved/stored in database?
A little logical observation can reveal the little "secrets" working behind.
Currently the first "obvious fact" is that the shortcut has always a fixed length. In fact, the effective length looks as if it is exactly six (last 6 characters) but it has started from single digit and now it is generating all urls with six digit until threshold for it is reached then it will move to 7 digits.
The second "obvious fact" is that the shortcut consists of only small-caps letters and the digits 0-9.
The above observations quickly lead to the conclusion that the number of all possible configurations of the second part of the shortcut string is bounded above by 366 = (26 letters + 10 digits)6. This number equals 2176782336 and is close to int primitive data type in java
.
Thus all one has to do is to generate a class that creates a incremental unique alphanumeric number and store the original url reference in db and show it whenever that particular tinyurl is invoked.
Easy Logic,Go implement it.
This blog is about my observations and thoughts related to software development. These observations include tips and tricks that I have learned, solutions to problems I have faced, and other concepts I have found interesting and useful. This blog is intended to provide information to help other developers facing the same issues as well as providing me a method to document things in a well-known location for my future reference.
Friday, July 09, 2010
Thursday, July 08, 2010
Enabling plain text copy in fckeditor
Recently I came across a very weird scenario where I was required to use fckeditor instead of normal html text area to allow user to format text typed by him.
This all lead to another problem that user can copy from anywhere and paste it in the editor area and when which allows special formatting and external images styles and other html, which affected the content rendering functionality.
So to control the user inputs we need to allow only plain text inputs inspite what ever user have copied to clipboard from other souce using Ctrl+C keystrokes.
I was moving from pillar to post to get this plain text functionality working, looking for plugins and any proper solution in forums.
Finallybu doing minor changes to configuration file (thanks to fckeditor developer for allowing easy configurations) of fckeditor i am able to get what i want.
Open the orginal configuration file that comes with editor and look for code
FCKConfig.ForcePasteAsPlainText = false;
FCKConfig.Keystrokes = [
[ CTRL + 65 /*A*/, true ],
[ CTRL + 67 /*C*/, true ],
[ CTRL + 70 /*F*/, true ],
[ CTRL + 83 /*S*/, true ],
[ CTRL + 84 /*T*/, true ],
[ CTRL + 88 /*X*/, true ],
[ CTRL + 86 /*V*/, 'Paste' ],
[ CTRL + 45 /*INS*/, true ],
[ SHIFT + 45 /*INS*/, 'Paste' ],
[ CTRL + 88 /*X*/, 'Cut' ],
[ SHIFT + 46 /*DEL*/, 'Cut' ],
[ CTRL + 90 /*Z*/, 'Undo' ],
[ CTRL + 89 /*Y*/, 'Redo' ],
[ CTRL + SHIFT + 90 /*Z*/, 'Redo' ],
[ CTRL + 76 /*L*/, 'Link' ],
[ CTRL + 66 /*B*/, 'Bold' ],
[ CTRL + 73 /*I*/, 'Italic' ],
[ CTRL + 85 /*U*/, 'Underline' ],
[ CTRL + SHIFT + 83 /*S*/, 'Save' ],
[ CTRL + ALT + 13 /*ENTER*/, 'FitWindow' ],
[ SHIFT + 32 /*SPACE*/, 'Nbsp' ]
] ;
Now open your custom configuration file (or create one http://docs.cksource.com/FCKeditor_2.x/Developers_Guide/Configuration_File)
FCKConfig.ForcePasteAsPlainText = true ;
FCKConfig.Keystrokes = [
[ CTRL + 65 /*A*/, true ],
[ CTRL + 67 /*C*/, true ],
[ CTRL + 70 /*F*/, true ],
[ CTRL + 83 /*S*/, true ],
[ CTRL + 84 /*T*/, true ],
[ CTRL + 88 /*X*/, true ],
[ CTRL + 86 /*V*/, 'PasteText' ],
[ CTRL + 45 /*INS*/, true ],
[ SHIFT + 45 /*INS*/, 'PasteText' ],
[ CTRL + 88 /*X*/, 'Cut' ],
[ SHIFT + 46 /*DEL*/, 'Cut' ],
[ CTRL + 90 /*Z*/, 'Undo' ],
[ CTRL + 89 /*Y*/, 'Redo' ],
[ CTRL + SHIFT + 90 /*Z*/, 'Redo' ],
[ CTRL + 76 /*L*/, 'Link' ],
[ CTRL + 66 /*B*/, 'Bold' ],
[ CTRL + 73 /*I*/, 'Italic' ],
[ CTRL + 85 /*U*/, 'Underline' ],
[ CTRL + SHIFT + 83 /*S*/, 'Save' ],
[ CTRL + ALT + 13 /*ENTER*/, 'FitWindow' ],
[ SHIFT + 32 /*SPACE*/, 'Nbsp' ]
] ;
This all lead to another problem that user can copy from anywhere and paste it in the editor area and when which allows special formatting and external images styles and other html, which affected the content rendering functionality.
So to control the user inputs we need to allow only plain text inputs inspite what ever user have copied to clipboard from other souce using Ctrl+C keystrokes.
I was moving from pillar to post to get this plain text functionality working, looking for plugins and any proper solution in forums.
Finallybu doing minor changes to configuration file (thanks to fckeditor developer for allowing easy configurations) of fckeditor i am able to get what i want.
Open the orginal configuration file that comes with editor and look for code
FCKConfig.ForcePasteAsPlainText = false;
FCKConfig.Keystrokes = [
[ CTRL + 65 /*A*/, true ],
[ CTRL + 67 /*C*/, true ],
[ CTRL + 70 /*F*/, true ],
[ CTRL + 83 /*S*/, true ],
[ CTRL + 84 /*T*/, true ],
[ CTRL + 88 /*X*/, true ],
[ CTRL + 86 /*V*/, 'Paste' ],
[ CTRL + 45 /*INS*/, true ],
[ SHIFT + 45 /*INS*/, 'Paste' ],
[ CTRL + 88 /*X*/, 'Cut' ],
[ SHIFT + 46 /*DEL*/, 'Cut' ],
[ CTRL + 90 /*Z*/, 'Undo' ],
[ CTRL + 89 /*Y*/, 'Redo' ],
[ CTRL + SHIFT + 90 /*Z*/, 'Redo' ],
[ CTRL + 76 /*L*/, 'Link' ],
[ CTRL + 66 /*B*/, 'Bold' ],
[ CTRL + 73 /*I*/, 'Italic' ],
[ CTRL + 85 /*U*/, 'Underline' ],
[ CTRL + SHIFT + 83 /*S*/, 'Save' ],
[ CTRL + ALT + 13 /*ENTER*/, 'FitWindow' ],
[ SHIFT + 32 /*SPACE*/, 'Nbsp' ]
] ;
Now open your custom configuration file (or create one http://docs.cksource.com/FCKeditor_2.x/Developers_Guide/Configuration_File)
FCKConfig.ForcePasteAsPlainText = true ;
FCKConfig.Keystrokes = [
[ CTRL + 65 /*A*/, true ],
[ CTRL + 67 /*C*/, true ],
[ CTRL + 70 /*F*/, true ],
[ CTRL + 83 /*S*/, true ],
[ CTRL + 84 /*T*/, true ],
[ CTRL + 88 /*X*/, true ],
[ CTRL + 86 /*V*/, 'PasteText' ],
[ CTRL + 45 /*INS*/, true ],
[ SHIFT + 45 /*INS*/, 'PasteText' ],
[ CTRL + 88 /*X*/, 'Cut' ],
[ SHIFT + 46 /*DEL*/, 'Cut' ],
[ CTRL + 90 /*Z*/, 'Undo' ],
[ CTRL + 89 /*Y*/, 'Redo' ],
[ CTRL + SHIFT + 90 /*Z*/, 'Redo' ],
[ CTRL + 76 /*L*/, 'Link' ],
[ CTRL + 66 /*B*/, 'Bold' ],
[ CTRL + 73 /*I*/, 'Italic' ],
[ CTRL + 85 /*U*/, 'Underline' ],
[ CTRL + SHIFT + 83 /*S*/, 'Save' ],
[ CTRL + ALT + 13 /*ENTER*/, 'FitWindow' ],
[ SHIFT + 32 /*SPACE*/, 'Nbsp' ]
] ;
Monday, June 28, 2010
JQuery hide/show menu item persistence
I was working on search filters. The needed functionality is to toggle the set of checkbox elements and persist the user selected options. I want to do all this at browser end...
Here is how i did it...
Below is a html code
<div>
<a href="javascript:void(0);" id="xyz">Click here</a>
</div>
<div id="abc">
<div>one</div>
<div>two</div>
<div>three</div>
</div>
The needed functionality is when user hide/show the div with id= "abc", then it should persist untill user closes the browser..
jQuery(function(){
// on page load call
<portlet:namespace/>toggleCookie("abc");
<portlet:namespace/>hideShow("abc");
jQuery("#xyz").click(function(){
<portlet:namespace/>toggleCookie("abc");
<portlet:namespace/>hideShow("abc");
});
});
function <portlet:namespace/>hideShow(objId){
if (jQuery.cookie(objId) == null || jQuery.cookie(objId) == "hide") {
jQuery("#"+objId).hide();
}
else {
jQuery("#"+objId).show();
}
}
function <portlet:namespace/>toggleCookie(objId){
if(jQuery.cookie(objId) == null){
jQuery.cookie(objId, "hide");
}
else if(jQuery.cookie(objId) == "hide"){
jQuery.cookie(objId, "show");
}
else if(jQuery.cookie(objId) == "show"){
jQuery.cookie(objId, "hide");
}
}
Here is how i did it...
Below is a html code
<div>
<a href="javascript:void(0);" id="xyz">Click here</a>
</div>
<div id="abc">
<div>one</div>
<div>two</div>
<div>three</div>
</div>
The needed functionality is when user hide/show the div with id= "abc", then it should persist untill user closes the browser..
jQuery(function(){
// on page load call
<portlet:namespace/>toggleCookie("abc");
<portlet:namespace/>hideShow("abc");
jQuery("#xyz").click(function(){
<portlet:namespace/>toggleCookie("abc");
<portlet:namespace/>hideShow("abc");
});
});
function <portlet:namespace/>hideShow(objId){
if (jQuery.cookie(objId) == null || jQuery.cookie(objId) == "hide") {
jQuery("#"+objId).hide();
}
else {
jQuery("#"+objId).show();
}
}
function <portlet:namespace/>toggleCookie(objId){
if(jQuery.cookie(objId) == null){
jQuery.cookie(objId, "hide");
}
else if(jQuery.cookie(objId) == "hide"){
jQuery.cookie(objId, "show");
}
else if(jQuery.cookie(objId) == "show"){
jQuery.cookie(objId, "hide");
}
}
Saturday, March 20, 2010
Securing JBoss Web Console
The security setup is based on two pieces, the standard WEB-INF/web.xml servlet URI to role specification, and the WEB-INF/jboss-web.xml specification of the JAAS configuration which defines how authentication and role mapping is performed. To secure the Web Console using a username/password file -
- Locate the web-console.war directory in JBoss. This will normally be in <JBOSS Install dir>/server/default/deploy/management/console-mgr.sar directory.
- Edit <JBOSS Install dir>/server/default/deploy/management/console-mgr.sar/web-console.war/WEB-INF/web.xml and uncomment the following security-constraint block
<!-- A security constraint that restricts access to the HTML JMX console to users with the role JBossAdmin. Edit the roles to what you want and uncomment the WEB-INF/jboss-web.xml/security-domain element to enable secured access to the HTML JMX console. --> <security-constraint> <web-resource-collection> <web-resource-name>HtmlAdaptor</web-resource-name> <description>An example security config that only allows users with the role JBossAdmin to access the HTML JMX console web application </description> <url-pattern>/*</url-pattern> <http-method>GET</http-method> <http-method>POST</http-method> </web-resource-collection> <auth-constraint> <role-name>JBossAdmin</role-name> </auth-constraint> </security-constraint> <login-config> <auth-method>BASIC</auth-method> <realm-name>JBoss JMX Console</realm-name> </login-config> <security-role> <role-name>JBossAdmin</role-name> </security-role>
- Edit the <JBOSS Install dir>/server/default/deploy/management/console-mgr.sar/web-console.war/WEB-INF/classes/web-console-roles.properties and web-console-users.properties, and move those files to <JBOSS Install dir>/server/default/conf/props directory. and change the users and passwords to what you desire. The only change above should be to web-console-users.properties, i.e, set a password.
- Edit <JBOSS Install dir>/server/default/deploy/management/console-mgr.sar/web-console.war/WEB-INF/jboss-web.xml and uncomment the following security-domain block:-
<jboss-web><!-- Uncomment the security-domain to enable security. You will need to edit the htmladaptor login configuration to setup the login modules used to authentication users. --> <security-domain>java:/jaas/jmx-console</security-domain> </jboss-web>
- The security-domain value of web-console maps is declared in the login-config.xml JAAS configuration file which defines how authentication and authorization is done. edit <JBOSS Install dir>/server/default/conf/login-config.xml Change the path to the web-console-users.properties and the web-console-roles.properties as follows (add props/ to the front of the path)
<module-option name="usersProperties">props/web-console-users.properties</module-option> <module-option name="rolesProperties">props/web-console-roles.properties</module-option>
Securing JBoss jmx-console
Both the jmx-console and web-console are standard servlet 2.3 deployments and can be secured using J2EE role based security. Both also have a skeleton setup to allow one to easily enable security using username/password/role mappings found in the jmx-console.war and web-console.war deployments in the corresponding WEB-INF/classes users.properties and roles.properties files.
The security setup is based on two pieces, the standard WEB-INF/web.xml servlet URI to role specification, and the WEB-INF/jboss-web.xml specification of the JAAS configuration which defines how authentication and role mapping is performed.To secure the JMX Console using a username/password file:
The security-domain value of jmx-console maps is declared in the login-config.xml JAAS configuration file which defines how authentication and authorization is done.
The security setup is based on two pieces, the standard WEB-INF/web.xml servlet URI to role specification, and the WEB-INF/jboss-web.xml specification of the JAAS configuration which defines how authentication and role mapping is performed.To secure the JMX Console using a username/password file:
- Locate the jmx-console.war directory. This will normally be in
/server/default/deploy directory. - Edit
/server/default/deploy/jmx-console.war/WEB-INF/web.xml and uncomment the following security-constraint block
A security constraint that restricts access to the HTML JMX console
to users with the role JBossAdmin. Edit the roles to what you want and
uncomment the WEB-INF/jboss-web.xml/security-domain element to enable
secured access to the HTML JMX console.
<security-constraint> <web-resource-collection> <web-resource-name>HtmlAdaptor</web-resource-name> <description>An example security config that only allows users with the role JBossAdmin to access the HTML JMX console web application </description> <url-pattern>/*</url-pattern> <http-method>GET</http-method> <http-method>POST</http-method> </web-resource-collection> <auth-constraint> <role-name>JBossAdmin</role-name> </auth-constraint> </security-constraint> <login-config> <auth-method>BASIC</auth-method> <realm-name>JBoss JMX Console</realm-name> </login-config> <security-role> <role-name>JBossAdmin</role-name> </security-role>
- Edit
/server/default/conf/props/jmx-console-users.properties (version >=4.0.2) and/server/default/conf/props/jmx-console-roles.properties (version >=4.0.2) and change the users and passwords to what you desire. They will need the JBossAdmin role specified in the web.xml file to run the JMX Console. The only change above should be to jmx-console-users.properties, i.e, set a password. - Edit
/server/default/jmx-console.war/WEB-INF/jboss-web.xml and uncomment the following security-domain block:-
<jboss-web> <!-- Uncomment the security-domain to enable security. You will need to edit the htmladaptor login configuration to setup the login modules used to authentication users. --> <security-domain>java:/jaas/jmx-console</security-domain> </jboss-web>
The security-domain value of jmx-console maps is declared in the login-config.xml JAAS configuration file which defines how authentication and authorization is done.
Subscribe to:
Posts (Atom)