Monday, October 10, 2016

Grails application: Create an common structure for domain class as artifact for common functionality when create new domain class

Create a groovy file under directory 'src/groovy/templates/artifacts' with name 'DomainClass.groovy" with following contents.

NB: Class name is significant here.

And then when you create an domain class, the new domain class structure will be as like this.


@artifact.package@

class @artifact.name@ {
    Long id
    String name
    String displayName
    String description

    Date created
    Date updated

    static constraints = {
        name(blank: false, minSize: 1, maxSize: 255)
        displayName(nullable: true, minSize: 1, maxSize: 255)
        description(nullable: true, maxSize: 500)
    }
}


And another example for your controller then groovy file name must be 'Controller.groovy' with following contents


@artifact.package@
import com.pkm.GeneralExceptionHandler
import com.pkm.services.DataReadService

class @artifact.name@ implements GeneralExceptionHandler {
    DataReadService dataReadService

    def index() {

    }
}


And when you create any Controller that would be look like as follows


package com.pkm

import com.pkm.GeneralExceptionHandler
import com.pkm.services.DataReadService

class PkmController implements GeneralExceptionHandler {
    DataReadService dataReadService

    def index() {

    }
}

Wednesday, October 5, 2016

Get all columns from all MySQL tables


SELECT * FROM information_schema.columns
WHERE table_schema = 'database_name'
ORDER BY table_name, ordinal_position

How to reset a particular form field using jQuery

Full code snippet

<head>
    <script src="//ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
</head>
<body>
<form style="margin: 50px;">
    <div>
        <input type='text' value='Default value' class="check_overall_change" style='width:206px'/>
        <button type='button'>Reset</button>
    </div>

    <div>
        <input type='checkbox' name='checkbox' value='1' class="check_overall_change"/> #1
        <input type='checkbox' name='checkbox' value='2' checked class="check_overall_change"/> #2
        <input type='checkbox' name='checkbox' value='3' class="check_overall_change"/> #3
        <button type='button' style='margin-left:78px'>Reset</button>
    </div>

    <div>
        <select style='width:206px' class="check_overall_change">
            <option value='1'>1</option>
            <option value='2'>2</option>
            <option value='3' selected>3</option>
        </select>
        <button type='button'>Reset</button>
    </div>

    <div>
        <select multiple style='width:206px' class="check_overall_change">
            <option value='1'>1</option>
            <option value='2' selected>2</option>
            <option value='3'>3</option>
            <option value='4' selected>4</option>
        </select>
        <button type='button'>Reset</button>
    </div>
    <div class="log"></div>
</form>
</body>
<script type="text/javascript">
    var baseConfig = getOverallValue(), log = $(".log");

    $(".check_overall_change").on("change", function () {
        checkFormValueChanged();
    })

    $(".check_overall_change[type='text']").on("keyup", function () {
        checkFormValueChanged();
    })

    function checkFormValueChanged() {
        if(baseConfig != getOverallValue()) {
            log.html("<h3>Value changed</h3>");
        }
        else {
            log.html("<h3>Value not changed</h3>");
        }
    }

    function resetForm() {
        var thiz = $(this), input = thiz.closest("div").find(":input:not(button)");
        if(input.is("select")) {
            var values = [];
            var options = input.find("option");
            for(var index = 0; index < options.length; index++) {
                if(options[index].defaultSelected) {
                    values.push($(options[index]).val())
                }
            }
            input.val(values);
        }
        else if(input[0].type == 'checkbox') {
            for(var index = 0; index < input.length; index++) {
                if(input[index].defaultChecked) {
                    $(input[index]).prop("checked", "checked");
                }
                else {
                    $(input[index]).prop("checked", null);
                }
            }
        }
        else {
            input.val(input[0].defaultValue)
        }
        checkFormValueChanged();
    }

    function getOverallValue() {
        var values = "";
        $(".check_overall_change").each(function (index, element) {
            element = $(element);
            if(element[0].type == 'checkbox') {
                values += element.is(":checked") + "-";
            }
            else {
                values += element.val() + "-";
            }
        })
        return values;
    }

    $("button").bind("click", resetForm);
</script>

And finally jsFiddle link to test yourself

Click here to test yourself at jsFiddle

Monday, September 26, 2016

File Change Listener Implementation Using Java


package com.pritom.kumar;

import java.io.File;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardWatchEventKinds;
import java.nio.file.WatchEvent;
import java.nio.file.WatchKey;
import java.nio.file.WatchService;
import java.util.List;

/**
 * Created by pritom on 25/09/2016.
 */
public class ChangeFileListener {
    public static void main(String[] args) throws Exception {
        startWatch("C:/tmp");
    }

    public static void startWatch(String location) {
        try {
            Path directory = Paths.get(location);
            println("Start listening directory: [" + location + "]");
            final WatchService watchService = directory.getFileSystem().newWatchService();
            directory.register(watchService, StandardWatchEventKinds.ENTRY_CREATE, StandardWatchEventKinds.ENTRY_DELETE, StandardWatchEventKinds.ENTRY_MODIFY);

            while (true) {
                final WatchKey watchKey = watchService.take();
                handleWatchTriggered(location, watchKey);
                boolean valid = watchKey.reset();
                if (!valid) {
                    throw new Exception("Watcher failed for listen [" + location + "]");
                }
            }
        }
        catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    private static void handleWatchTriggered(String location, WatchKey watchKey) throws Exception {
        List<WatchEvent<?>> watchEventList = watchKey.pollEvents();
        for (WatchEvent watchEvent : watchEventList) {
            if (watchEvent.kind() == StandardWatchEventKinds.ENTRY_CREATE) {
                println("Created: [" + watchEvent.context().toString() + "]");
                File fileCreated = new File(location + "/" + watchEvent.context().toString());
            }
            else if (watchEvent.kind() == StandardWatchEventKinds.ENTRY_DELETE) {
                println("Deleted: [" + watchEvent.context().toString() + "]");
            }
            else if (watchEvent.kind() == StandardWatchEventKinds.ENTRY_MODIFY) {
                println("Modified: [" + watchEvent.context().toString() + "]");
            }
        }
    }

    public static void println(Object o) {
        System.out.println("" + o);
    }
}

Friday, September 23, 2016

MySQL list all foreign key and other constraint names


SELECT  TABLE_NAME, COLUMN_NAME, CONSTRAINT_NAME, 
        REFERENCED_TABLE_NAME, REFERENCED_COLUMN_NAME

FROM    INFORMATION_SCHEMA.KEY_COLUMN_USAGE

WHERE   REFERENCED_TABLE_SCHEMA = 'database_name'

Sunday, September 11, 2016

Python parse xml


import sys
import xml.etree.ElementTree as ET

class XmlParser:
    def fixAttrs(self, attrs, c):
        nattrs = {}
        for attr in attrs:
            nattrs[self.buildXmlnsKey(attr, c)] = attrs[attr]
        return nattrs

    def buildXmlnsKey(self, tagtxt, tcounter):
        done = False
        if not tagtxt.startswith("{"):
            return tagtxt
        #print 'Search for: ', tagtxt, ' in ', tcounter
        if self.nsmap.has_key(str(tcounter)):
            nslmap = self.nsmap[str(tcounter)]
            #print 'nslmap-->', nslmap
            for obj in nslmap:
                if done is False:
                    for key in obj.keys():
                        kstr = '{' + key + '}'
                        #print 'key--->', key, ', --->', kstr
                        if tagtxt.startswith(kstr) and done is False:
                            done = True
                            kval = obj[key]
                            #print 'need to replace to: ', kval
                            if len(kval):
                                tagtxt = tagtxt.replace(kstr, kval+':', 1)
                            else:
                                tagtxt = tagtxt.replace(kstr, '', 1)

        if done is False and tcounter > 0:
            tcounter = tcounter - 1
            return self.buildXmlnsKey(tagtxt, tcounter)
        return tagtxt
                        

    def xmlToDict(self, node, dictclass = None):
        if dictclass is None:
            dictclass = {}
        self.ncounter = self.ncounter + 1
        if len(node):        
            if node.attrib:
                #print node.attrib
                dictclass['<<attr>>'] = self.fixAttrs(node.attrib, self.ncounter);            
            for child in node:
                tagtxt = self.buildXmlnsKey(child.tag, self.ncounter)
                newItem = self.xmlToDict(child)
                #tagtxt = child.tag
                if dictclass.has_key(tagtxt):
                    if type(dictclass[tagtxt]) is type([]):
                        dictclass[tagtxt].append(newItem)
                    else:
                        oldItem = dictclass[tagtxt];
                        dictclass[tagtxt] = [];
                        dictclass[tagtxt].append(oldItem);
                        dictclass[tagtxt].append(newItem);
                else:
                    dictclass[tagtxt] = newItem
        else:
            if node.text is None:
                text = ''
            else:
                text = node.text.strip()

            
            if node.attrib:
                #print fixAttrs(node.attrib, ncounter)
                dictclass['<<attr>>'] = self.fixAttrs(node.attrib, self.ncounter)
                dictclass['<<value>>'] = text;
            else:
                dictclass = text;

        return dictclass

    def printDic(self, dic, pos = None):
        if pos is None:
            pos = 0
        for key in dic.keys():
            #print 'key--->', key
            if dic[key] is None:
                print self.getLenStr(pos), key, ''
            elif type(dic[key]) is type({}):
                npos = pos + 1
                print self.getLenStr(pos) + str(key), '{'
                self.printDic(dic[key], npos)
                print self.getLenStr(pos) + '}'
            elif type(dic[key]) is type([]):
                npos = pos + 1
                print self.getLenStr(pos) + str(key), '['
                self.printList(dic[key], npos)
                print self.getLenStr(pos) + ']'
            else:
                print self.getLenStr(pos) + str(key), ': ', dic[key]

    def printList(self, dic, pos = None):
        if pos is None:
            pos = 0
        lindex = -1
        for obj in dic:
            lindex = lindex + 1            
            if obj is not None:
                if type(obj) is type({}):
                    print self.getLenStr(pos) + str(lindex)+'. {'
                    npos = pos + 1
                    self.printDic(obj, npos)
                    print self.getLenStr(pos) + '}'
                elif type(obj) is type([]):
                    print self.getLenStr(pos) + str(lindex)+'. ['
                    npos = pos + 1
                    self.printList(obj, npos)
                    print self.getLenStr(pos) +']'
                else:
                    print self.getLenStr(pos), str(lindex)+'.', obj

    def getLenStr(self, pos):
        sstr = ''
        while pos > 0:
            sstr = sstr + '   '
            pos = pos - 1
        return sstr

    def __init__(self, fileLocation):
        self.location = fileLocation;

    def parse(self):
        tree = ET.parse(self.location)
        root = tree.getroot()
        self.nsmap = {}
        self.lcounter = 0

        for event, elem in ET.iterparse(self.location, events=('start', 'end', 'start-ns', 'end-ns')):
            if event == 'start-ns':
                #print 'start-ns', lcounter
                a, b = elem
                if b is not None and len(b):
                    #print "A-->", a, ", B-->" , b
                    scounter = self.lcounter + 0
                    if not self.nsmap.has_key(str(scounter)):
                        self.nsmap[str(scounter)] = []
                        self.nsmap[str(scounter)].append({'http://www.w3.org/XML/1998/namespace': 'xml'});
                    self.nsmap[str(scounter)].append({b: str(a)})
            elif event == 'start':
                #print 'start', lcounter
                if not self.nsmap.has_key(str(self.lcounter)) and self.nsmap.has_key(str(self.lcounter - 1)):
                    #print 'exist: ', nsmap[str(lcounter - 1)]
                    self.nsmap[str(self.lcounter)] = self.nsmap[str(self.lcounter - 1)];
                self.lcounter = self.lcounter + 1       

        self.ncounter = 0
        self.dic = self.xmlToDict(root)
        self.dic = {self.buildXmlnsKey(root.tag, 0): self.dic}
        return self.dic;

if __name__ == "__main__":
    xmlObj = XmlParser('xml7.xml');
    theXmlDictionary = xmlObj.parse()
    xmlObj.printDic(theXmlDictionary);

Suppose you have the xml as file:


<?xml version="1.0"?>
<lib:library
    xmlns:lib="http://eric.van-der-vlist.com/ns/library"
    xmlns:hr="http://eric.van-der-vlist.com/ns/person">
    <lib:book id="b0836217462" available="true">
        <lib:isbn>0836217462</lib:isbn>
        <lib:title xml:lang="en">Being a Dog Is a Full-Time Job</lib:title>
        <hr:author id="CMS">
            <hr:name>Charles M Schulz</hr:name>
            <hr:born>1922-11-26</hr:born>
            <hr:dead>2000-02-12</hr:dead>
        </hr:author>
        <lib:character id="PP">
            <hr:name>Peppermint Patty</hr:name>
            <hr:born>1966-08-22</hr:born>
            <lib:qualification>bold, brash and tomboyish</lib:qualification>
        </lib:character>
        <lib:character id="Snoopy">
            <hr:name>Snoopy</hr:name>
            <hr:born>1950-10-04</hr:born>
            <lib:qualification>extroverted beagle</lib:qualification>
        </lib:character>
        <lib:character id="Schroeder">
            <hr:name>Schroeder</hr:name>
            <hr:born>1951-05-30</hr:born>
            <lib:qualification>brought classical music to the Peanuts strip</lib:qualification>
        </lib:character>
        <lib:character id="Lucy">
            <hr:name>Lucy</hr:name>
            <hr:born>1952-03-03</hr:born>
            <lib:qualification>bossy, crabby and selfish</lib:qualification>
        </lib:character>
    </lib:book>
    <Purchase>
        <PurchaseId>AAAAA</PurchaseId>
        <PurchaseType>ONLINE</PurchaseType>
    </Purchase>
    <Purchase>
        <PurchaseId>BBBBB</PurchaseId>
        <PurchaseType>OFFLINE</PurchaseType>
    </Purchase>
    <Purchase paid='True'>
        <Purchase age='30'>
            <Purchase>HMM 1</Purchase>
            <Purchase>HMM 2</Purchase>
        </Purchase>
    </Purchase>
</lib:library>

Output would be like this:

lib:library {
   Purchase [
      0. {
         PurchaseId :  AAAAA
         PurchaseType :  ONLINE
      }
      1. {
         PurchaseId :  BBBBB
         PurchaseType :  OFFLINE
      }
      2. {
         <<attr>> {
            paid :  True
         }
         Purchase {
            <<attr>> {
               age :  30
            }
            Purchase [
                0. HMM 1
                1. HMM 2
            ]
         }
      }
   ]
   lib:book {
      hr:author {
         <<attr>> {
            id :  CMS
         }
         hr:name :  Charles M Schulz
         hr:born :  1922-11-26
         hr:dead :  2000-02-12
      }
      <<attr>> {
         available :  true
         id :  b0836217462
      }
      lib:title {
         <<attr>> {
            xml:lang :  en
         }
         <<value>> :  Being a Dog Is a Full-Time Job
      }
      lib:isbn :  0836217462
      lib:character [
         0. {
            <<attr>> {
               id :  PP
            }
            hr:name :  Peppermint Patty
            hr:born :  1966-08-22
            lib:qualification :  bold, brash and tomboyish
         }
         1. {
            <<attr>> {
               id :  Snoopy
            }
            hr:name :  Snoopy
            hr:born :  1950-10-04
            lib:qualification :  extroverted beagle
         }
         2. {
            <<attr>> {
               id :  Schroeder
            }
            hr:name :  Schroeder
            hr:born :  1951-05-30
            lib:qualification :  brought classical music to the Peanuts strip
         }
         3. {
            <<attr>> {
               id :  Lucy
            }
            hr:name :  Lucy
            hr:born :  1952-03-03
            lib:qualification :  bossy, crabby and selfish
         }
      ]
   }
}

Friday, September 9, 2016

An educational story according to workers & managers in an organization

এক দেশে ছিলো এক পিপড়া। সে প্রতিদিন ৯টায় অফিসে ঢুকতো। তারপর কারো সঙ্গে সময় নষ্ট না করে সঙ্গে সঙ্গে কাজে বসে যেত।
সে যে পরিমাণ কাজ করত, তাতে কোম্পানির উৎপাদন হতো প্রচুর এবং এর ফলে সে আনন্দের সঙ্গেই জীবন নির্বাহ করত।
ওই অফিসের সিইও সিংহ অবাক হয়ে দেখত, এই পিঁপড়াটি কোনো ধরনের সুপারভিশন ছাড়াই প্রচুর কাজ করছে। সিংহ ভাবল, পিঁপড়াকে যদি কারও সুপারভিশনে দেওয়া হয়, তাহলে সে আরও বেশি কাজ করতে পারবে।
কয়েক দিনের মধ্যেই সিংহ একটি তেলাপোকাকে পিঁপড়ার সুপারভাইজার হিসেবে নিয়োগ দিল। সুপারভাইজার হিসেবে এই তেলাপোকাটির ছিল দীর্ঘদিনের অভিজ্ঞতা, আর সে দুর্দান্ত রিপোর্ট লিখতে পারত।
তেলাপোকাটি প্রথমেই সিদ্ধান্ত নিল, এই অফিসে একটি অ্যাটেনডেন্স সিস্টেম থাকা উচিত।
কয়েক দিনের মধ্যেই তেলাপোকার মনে হলো, তার একজন সেক্রেটারি দরকার, যে তাকে রিপোর্ট লিখতে সাহায্য করবে। … সে একটা মাকড়সাকে নিয়োগ দিল এই কাজে যে সব ফোনকল মনিটর করবে, আর নথিপত্র রাখবে।
সিংহ খুব আনন্দ নিয়ে দেখল যে তেলাপোকা তাকে প্রতিদিনের কাজের হিসাব দিচ্ছে আর সেগুলো বিশ্লেষণ করছে গ্রাফের মাধ্যমে। ফলে খুব সহজেই উৎপাদনের ধারা সম্পর্কে ধারণা নেওয়া যাচ্ছে এবং সিংহ সেগুলো বোর্ড মিটিংয়ে ‘প্রেজেন্টেশন’ আকারে পেশ করে বাহবা পাচ্ছে।
কিছুদিনের মধ্যেই তেলাপোকার একটি কম্পিউটার ও লেজার প্রিন্টার প্রয়োজন হলো এবং এগুলো দেখভালের জন্য আইটি ডিপার্টমেন্ট গঠন করল। আইটি বিশেষজ্ঞ হিসেবে নিয়োগ পেল মাছি।
আমাদের কর্মী পিঁপড়া, যে প্রতিদিন অফিসে এসে প্রচুর কাজ করে মনের সুখে গান গাইতে গাইতে বাসায় ফিরত, তাকে এখন প্রচুর পেপার ওয়ার্ক করতে হয়, সপ্তাহের চার দিনই নানা মিটিংয়ে হাজিরা দিতে হয়।
নিত্যদিন এসব ঝামেলার কারণে কাজে ব্যাঘাত ঘটায় উৎপাদন কমতে লাগল, আর সে বিরক্ত হতে লাগল।
সিংহ সিদ্ধান্ত নিল, পিঁপড়া যে বিভাগে কাজ করে, সেটাকে একটা আলাদা ডিপার্টমেন্ট ঘোষণা করে সেটার একজন ডিপার্টমেন্ট প্রধান নিয়োগ দেওয়ার এটাই উপযুক্ত সময়।
সিংহ ঝিঁঝিপোকাকে ওই ডিপার্টমেন্টের প্রধান হিসেবে নিয়োগ দিল। ঝিঁঝিপোকা প্রথম দিন এসেই তার রুমের জন্য একটা আরামদায়ক কার্পেট ও চেয়ারের অর্ডার দিল।
কয়েক দিনের মধ্যেই অফিসের জন্য স্ট্র্যাটেজিক প্ল্যান তৈরি করতে ঝিঁঝি পোকার একটি কম্পিউটার ও ব্যক্তিগত সহকারীর প্রয়োজন হলো। কম্পিউটার নতুন কেনা হলেও ব্যক্তিগত সহকারী হিসেবে ঝিঁঝিপোকা নিয়োগ দিল তার পুরোনো অফিসের একজনকে।
পিঁপড়া যেখানে কাজ করে, সেখানে আগে ছিল চমৎকার একটা পরিবেশ। এখন সেখানে কেউ কথা বলে না, হাসে না। সবাই খুব মনমরা হয়ে কাজ করে।
ঝিঁঝিপোকা পরিস্থিতি উন্নয়নে সিংহকে বোঝাল, ‘অফিসে কাজের পরিবেশ’ শীর্ষক একটা স্টাডি খুব জরুরি হয়ে পড়েছে।
পর্যালোচনা করে সিংহ দেখতে পেল, পিঁপড়ার বিভাগে উৎপাদন আগের তুলনায় অনেক কমে গেছে।
কাজেই সিংহ কয়েক দিনের মধ্যেই স্বনামখ্যাত কনসালট্যান্ট পেঁচাকে অডিট রিপোর্ট এবং উৎপাদন বাড়ানোর উপায় বাতলে দেওয়ার জন্য নিয়োগ দিল।
পেঁচা তিন মাস পিঁপড়ার ডিপার্টমেন্ট মনিটর করল, সবার সঙ্গে ওয়ান টু ওয়ান কথা বলল। তারপর বেশ মোটাসোটা একটা রিপোর্ট পেশ করল সিংহের কাছে। ওই রিপোর্টের সারমর্ম হলো, এই অফিসে প্রয়োজনের তুলনায় কর্মী বেশি। কর্মী ছাঁটাই করা হোক।
পরের সপ্তাহেই বেশ কয়েকজন কর্মী ছাঁটাই করা হলো। বলুন তো, কে সর্বপ্রথম চাকরি হারাল?
ওই হতভাগ্য পিঁপড়া। কারণ, পেঁচার রিপোর্টে লেখা ছিল, ‘এই কর্মীর মোটিভেশনের ব্যাপক অভাব রয়েছে এবং সর্বদাই নেতিবাচক আচরণ করছে, যা অফিসের কর্মপরিবেশ নষ্ট করছে।
এবার ভাবুন তো, আপনার পজিশানটা কী আপনার অর্গানাইজেশনে?

( সংগৃহীতঃ বিদেশি গল্পের অবলম্বনে )