Wednesday, 6 July 2016

Run programs directly from your Blog or Website

How nice it would be if the programs in your website/blog is directly executable without copying to an editor. Yes now it is possible with JDoodle.com.

JDoodle is an online compiler and editor for Java, C, C++ and many more languages, now using JDoodle you can make the programs in your website executable for around 25 languages supported by JDoodle. Below is a sample program which you can execute from this blog itself.




Below is an another Java Program where you can pass Input Parameters to the program



Below is an another Java Program where you can pass Standard Input (STDIN) inputs to the program



Including executable programs into your website/blog is easy


  • Goto JDoodle.com
  • Sign-in, if you don't have an account create one, it just takes a minute.
  • select the language in which you want to write program
  • create a program
  • save the program
  • click on Others --> Share/Embed
  • copy embed url 
  • Goto your website insert the copied url in a div as follows
    • <div data-pym-src="https://www.jdoodle.com/embed/v0/java/jdk-1.8/1?stdin=0&arg=0"></div>
  • include the below at bottom  of the Blog Post or Website
    • <script src="https://www.jdoodle.com/assets/jdoodle-pym.min.js" type="text/javascript"></script>

By Default embed url will display the stdin (for all languages) and arguments (java only) input boxes, they can be disabled by passing following parameters

stdin=0 (hide stdin box), arg=0 (hide argument box), changing from 0 to 1 will display the boxes.

Please contact JDoodle and inform if you are embedding code in your site, so that they can update regarding embed functionality in advance if any.

Saturday, 7 February 2015

Hapijs in Openshift

Today I tried to host a small Hapijs app in Openshift, as it may be useful for others just documenting here,

Creating new Gear with Nodejs cartridge in Openshift

  1.  Goto https://openshift.redhat.com/app/console/applications 
  2. Click Add application and add nodejs cartridge
Create a Hapijs Application

  1.  clone the project just created in openshift. 
  2.  delete all the files/folders except .openshift folder (note: make sure files deleted in git as well)
  3.  create new hapijs project on the same folder (refer: http://hapijs.com/tutorials)
    • npm init
    • npm install --save hapi
  4. create a file called index.js with following content
#!/bin/env node
var Hapi = require('hapi');

// Create a server with a host and port
var server = new Hapi.Server();

var ipaddress = process.env.OPENSHIFT_NODEJS_IP;
var port      = process.env.OPENSHIFT_NODEJS_PORT || 8080;

if (typeof ipaddress === "undefined") {
    //  Log errors on OpenShift but continue w/ 127.0.0.1 - this allows us to run/test the app locally.
    console.warn('No OPENSHIFT_NODEJS_IP var, using 127.0.0.1');
    ipaddress = "127.0.0.1";
};

server.connection({
    host: ipaddress,
    port: port});

// Add the route
server.route({
    method: 'GET',
    path:'/',
    handler: function (request, reply) {
        reply.file('Hello World!!!');
    }
});

// Start the server
server.start();

Test it locally and push it to openshit, enjoy coding.

Sunday, 28 December 2014

Website Review Tool - Alternative to woorank

Website creation involves lot of things, Especially the search engine and mobile friendliness needs lot of factors to be maintained like,

1. load time
2. backlinks
3. social popularity
4. page rank
5. sitemap.xml and robots.txt
6. Html fitness
7. keyword positioning
8. security
9. Trust worthiness of your site
10. etc, etc.

Periodically checking these factors is very important to keep your search engine ranking and to attract more users. Using different tools to check different factors will take lot of time.

This post introduces a free online WebSite/SEO Review Tool called - Htmlbee.com, which reviews websites for so many factors in single click.


By using Htmlbee.com you can review your website for

1. Social Media positon
2. Google - Rank, pagespeed
3. Resource statistics
4. Html correctness/fitness
5. Performance
6. Keyword analysis
7. and many more (almost 45 slides with 100 items).

The good thing about this review is, it explains importance of each and every factor with your position. It gives lot of wealthy information about each review points on your site with authenticated reference links (mostly Googles Webmaster).

Once you click on the review button, it makes you wait for few seconds to collect all the information about your site (unlike few other review sites which displays partial informations and confuse), and presents all the information in a good slide format, which can be navigated using arrow keys or by swipe(in mobiles).

Even you can print the report in well formatted manner.

Below are some sample screens from the Htmlbee.com,







Remember Htmlbee.com is still in Beta, Check how your website doing today and share your comments here, Thanks.



Sunday, 21 July 2013

Grails - Broken Pipe and Cannot release connection

In one of my grails applications, I was getting the following exception often,

java.net.SocketException: Broken pipe
at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:109)
at java.net.SocketOutputStream.write(SocketOutputStream.java:153)
at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:82)
at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:140)
at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:3832)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2471)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2651)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2734)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2155)
at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:2322)
at org.apache.commons.dbcp.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:96)
at org.apache.commons.dbcp.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:96)
at org.grails.datastore.gorm.GormStaticApi$_methodMissing_closure2.doCall(GormStaticApi.groovy:108)
at grails.plugin.cache.web.filter.PageFragmentCachingFilter.doFilter(PageFragmentCachingFilter.java:195)
at grails.plugin.cache.web.filter.AbstractFilter.doFilter(AbstractFilter.java:63)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:722)
2013-07-21 12:28:16,794 [http-bio-80-exec-7] ERROR util.JDBCExceptionReporter  - Already closed.
2013-07-21 12:28:16,794 [http-bio-80-exec-7] ERROR util.JDBCExceptionReporter  - Already closed.
2013-07-21 12:28:16,807 [http-bio-80-exec-7] ERROR servlet.GrailsDispatcherServlet  - HandlerInterceptor.afterCompletion threw exception
org.hibernate.exception.GenericJDBCException: Cannot release connection
at grails.plugin.cache.web.filter.PageFragmentCachingFilter.doFilter(PageFragmentCachingFilter.java:195)
at grails.plugin.cache.web.filter.AbstractFilter.doFilter(AbstractFilter.java:63)
at grails.plugin.cache.web.filter.PageFragmentCachingFilter.doFilter(PageFragmentCachingFilter.java:195)
at grails.plugin.cache.web.filter.AbstractFilter.doFilter(AbstractFilter.java:63)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:722)
Caused by: java.sql.SQLException: Already closed.
at org.apache.commons.dbcp.PoolableConnection.close(PoolableConnection.java:114)
at org.apache.commons.dbcp.PoolingDataSource$PoolGuardConnectionWrapper.close(PoolingDataSource.java:191)
... 7 more

The reason was the database connections in the pool was not used for some time and the connection got closed, and when the application tries to use that it was throwing the exception.

The solution worked to me is

Just added 3 properties into my DataSource.groovy file as follows,

dbCreate = "update" // one of 'create', 'create-drop','update'
url = "jdbc:mysql://localhost/mydb?useUnicode=yes&characterEncoding=UTF-8"
username = "root"
password = "pwd"
properties {
        validationQuery = "select 1"
        testWhileIdle = true
        testOnBorrow = true

 }

you can find more information on this properties at http://commons.apache.org/proper/commons-dbcp/configuration.html

One more reason for the same problem could be double pooling, if you have configured your connection from application server (JNDI), please ensure you are not pooling the connections both in application server and grails application. Just remove one of the pooling to solve the issue.


Monday, 15 July 2013

JDoodle.com - Online Java Compiler - Online Java Editor - Java Code Online

As a java developer I often wanted to execute a small piece of code and test it quickly without opening an IDE. Some times the same bit of code we want to execute often and use the result somewhere. May be even we want to share that bit of joy with others. One of the solutions is JDoodle.com.

JDoodle.com helps compile and execute java programs online.  It has simple interface, give a try, if found useful share with friends. Share your thoughts about JDoodle.com here in comment.

Try some default shares

Hello World
Hello World with method
Sample with import and Input Arguments

some of the features you may like is

1. auto complete import - just type the class name it will come with whole bunch of suggestions for you, just select the one you want and click Tick button.

2. Recents - you can see all the recently executed codes in the browser here. even you can ask JDoodle to remember this between same browsers different session.

3. Share - makes sharing easier. Not all your code shared by default, so you can always control what to share and what not to.

Wednesday, 7 November 2012

Customizing Liferay Classes using ext plugin in 6.1

Liferay is highly flexible that developers can override any Liferay class by just replacing them in Ext Plugin. But overriding is not a very good action considering "Open for extension closed for Modification" Principle. 
so in this blog post I am going to show simple steps how to extend a Liferay class. 

Note: use ext plugin  class extension or replacement as a last resort if and only if the same cannot be achieved through hooks or other ways.

Step 1: Create you class by extending the Liferay class.
Step 2: Create a file called ext-spring in folder docroot/WEB-INF/ext-impl/src/META-INF
Step 3: From Liferay source code get the file portal-impl/src/META-INF/portal-spring.xml
Step 4: just copy the bean class you are extending from portal-spring.xml and paste to your ext-spring.xml, change the class name to your new extended class. (please ensure you have the <beans> outer tag too in ext-spring as in portal-spring)
step 5: deploy your ext, now Liferay will call your class instead of its own implementation.

Monday, 5 November 2012

Adding JQuery Library to Liferay 6.1 at Portal level

As all Liferay developers know, Liferay 5.2.x and earlier had included jQuery library by default at Portal level, so if we want to use jQuery in any portlet or plugins, we do not need to include the library. But from 6.0, Liferay is using YUI, so jQuery is not available by default and we need to include the jQuery library if we want to use.

The following blog entry from Liferay covers three different ways to include jQuery

http://www.liferay.com/web/nathan.cavanaugh/blog/-/blogs/5363997

1. Theme Level
2. Portlet Level
3. jsp level.

but I came across one scenario where we wanted to have the same behavior as in 5.2.3, we have multiple themes so we do not want to duplicate same code in every portlet, and want to include the jQuery at portal level..

The solution worked for us is

Step 1: included the jquery-1.2.6.min.js in your hook - /jsp-hook/docroot/WEB-INF/ext-web/docroot/html/js/jquery-1.2.6.min.js


Step 2: copy top_js.jspf from source and place that in your hook -  /jsp-hook/docroot/META-INF/custom_jsps/html/common/themes/ and add the the line

            <script src="/html/js/jquery-1.2.6.min.js"></script>

at the end of top_js.jspf.

so now jQuery available throughout the portal in all the themes. 

Monday, 3 September 2012

Is Chrome more secure than other Browsers in XSS attacks

I come across one interesting thing today, looks like Chrome and Safari are more advanced in preventing XSS attacks  than other browsers. To check this, write a small submit form as  below

Test1.jsp

 <body>  
  <form method="get" action="test2.jsp">  
      Attack using this box : <input type="text" name="attack"/>  
      <input type="submit"/>  
  </form>  
 </body>  

and a page to handle the submit

Test2.jsp

 <%=request.getParameter("attack")%>  

open the first one in a browser --> enter "<script> alert('hi......'); </script>" in the text box --> submit.

IE, Firefox, Opera - will show you an alert box with message "hi......"
Chrome and Safari - will not show anything but a blank screen.

In Chrome Console you can see the below error,

Refused to execute a JavaScript script. Source code of script found within request.

chrome detects the same source code in request and response and prevents the XSS attack. Same for Post method too.

Wednesday, 16 May 2012

adding set methods in JAXB for collections

Normally the JAXB generated classes will not contain set methods for collections. (The idea here is to access collections only using get as the basis assumption is the change only happens to the contents of the collection).

if you use the maven maven-jaxb2-plugin, then you can use collection-setter-injector plugin along with jaxb2 plugin to create set methods. Below is a sample configuration,


<plugin>

<groupId>org.jvnet.jaxb2.maven2</groupId>

<artifactId>maven-jaxb2-plugin</artifactId>

<executions>

<execution>

<goals>

<goal>generate</goal>

</goals>

<phase>generate-sources</phase>

</execution>

</executions>

<configuration>

<!-- This helps generate setter methods-->

<args>

<arg>-npa</arg>

<arg>-Xcollection-setter-injector</arg>

</args>

<extension>true</extension>

<episode>true</episode>

<plugins>

<!-- plugin to generate setter for collection-->

<plugin>

<groupId>net.java.dev.vcc.thirdparty</groupId>

<artifactId>collection-setter-injector</artifactId>

<version>0.5.0-1</version>

</plugin>

</plugins>          

</configuration>

</plugin>

Thursday, 12 April 2012

adding a new column as primary key in existing table

Today I come across a little tricky situation to add new column to existing table and make it as a primary key in MS SQL server, the solution is luckily simple,


 alter table my_table add [my_new_id] [int] IDENTITY(1,1);  
 alter table my_table add constraint pk_my_id primary key(my_new_id);  


if you already have a primary key, just remove that and add this new primary key.