Popular Posts

Wednesday, December 30, 2015

Changing Data Types with Liquibase


The other day I was changing some data types in our schema script and thought of sharing it as it might becomes trickier for some us. I use Liquibase for managing our database schema in groovy format, which is much easier as compared to XML, JSON and YAML formats and Liquibase just recently announced to adopt groovy format as well for writing schema scripts. So let's get started, let's consider this table schema in Liquibase script:

1:  changeSet(id: '1451109624', author: 'wakasmalik') {  
2:      createTable(tableName: 'LiquibaseExample) {  
3:        column(name: 'ID, type: 'NUMBER(19, 0)') {  
4:          constraints(nullable: false)  
5:        }  
6:        column(name: 'ABC', type: 'VARCHAR2(255 CHAR)')  
7:        column(name: 'DEF', type: 'VARCHAR2(255 CHAR)')  
8:        column(name: 'DATE_SAVED', type: 'TIMESTAMP')  
9:        column(name: 'DATE_CREATED', type: 'TIMESTAMP') {  
10:          constraints(nullable: false)  
11:        }  
12:        column(name: 'CREATED_BY', type: 'NUMBER(19, 0)') {  
13:          constraints(nullable: false)  
14:        }  
15:        column(name: 'MODIFIED_BY', type: 'NUMBER(19, 0)') {  
16:          constraints(nullable: false)  
17:        }  
18:      }  
19:    }  
20:    changeSet(id: '14511096241', author: 'wakasmalik') {  
21:      addPrimaryKey(columnNames: 'ID', constraintName: 'primaryKey', tableName: 'LiquibaseExample')  
22:    }  

Every change in Liquibase is added into a changeset. The id of the changeset has to be unique across all the changeset and most importantly it can be run only once on a database. Now let's say we want to change Data Types for these two columns:

  • Column ABC from String to Numeric without any NULL constraint.
  • Column Created_By from Numeric to String along with maintaining the NULL constraint.

Here is the changeset that will performs the above operations:

1:  changeSet(id: '1451273089', author: 'wakasmalik') {  
2:      modifyDataType(tableName: "LiquibaseExample", columnName: "ABC", newDataType: "NUMBER(19, 0)")  
3:      modifyDataType(tableName: "LiquibaseExample", columnName: "CREATED_BY", newDataType: "VARCHAR2(255 CHAR)")  
4:    }  


The above changeset will work fine as long as we don't have data in those two columns or we are fine losing data during conversion process and also the NULL constraint cannot be set on a empty column. These are typical scenarios for development machines and would rarely exists for a testing or production environments. So let's consider not modifying the Data Types instead drop the columns, add the columns, set column default values and then add NULL Constraint in the end.


1:  changeSet(id: '1451365535', author: 'wakasmalik') {  
2:      dropColumn(columnName: 'ABC', tableName: 'LiquibaseExample')  
3:      dropColumn(columnName: 'CREATED_BY', tableName: 'LiquibaseExample')  
4:      addColumn(tableName: 'LiquibaseExample') {  
5:        column(name: 'ABC', type: 'NUMBER(19, 0)')  
6:        column(name: 'CREATED_BY', type: 'VARCHAR2(255 CHAR)')  
7:      }  
8:      sql("UPDATE LiquibaseExample SET ABC = 11111")  
9:      sql("UPDATE LiquibaseExample SET CREATED_BY = '11111'")  
10:     addNotNullConstraint(columnName: 'CREATED_BY', tableName: 'LiquibaseExample')  
11:    }  


You can also use the "defaultValue" attribute to set the default values for a column instead of writing the sql query.
For a complete list of Liquibase supported attributes and examples in different formats, you can visit the Liquibase Documentation Page.

Leave a comment below if you like, dislike or need any help.

Sunday, September 27, 2015

Default Logout with Spring Security

The other day I was trying to implement "logout" functionality for one of my POC using spring security. I couldn't find a better and simple solution for "logout" in spring security as they have it for "login". As we know spring security by default have "formLogin()" built in which will display the login form to the user but it doesn't have anything for logout. So here what I comes up with:

1:  @Configuration  
2:  public class SecurityConfigurerAdapter extends WebSecurityConfigurerAdapter {  
3:       @Override  
4:       protected void configure(HttpSecurity http) throws Exception {  
5:            http  
6:                      .csrf()  
7:                      .disable()  
8:                      .and()  
9:                      .authorizeRequests()  
10:                    .anyRequest()  
11:                    .authenticated()  
12:                    .and()  
13:                    .formLogin()  
14:                    .permitAll()  
15:                    .and()  
16:                    .logout()  
17:                    .deleteCookies("remove")  
18:                    .invalidateHttpSession(false)  
19:                    .logoutRequestMatcher(new AntPathRequestMatcher("/logout"))  
20:                    .logoutSuccessUrl("/login");  
21:       }  

How this works:

Just type "logout" in header address bar and it will delete any user session cookies that spring security creates it by default, invalidates the user session and takes the user back to the default login page. Actually in the backend spring will look for any logout requests made and map it to the default login page after logging out the user. Isn't this simple and cool?

Please comment if you need any help implementing this functionality.

Monday, March 9, 2015

Flappy Andy

If I remember correctly at the time of Android Lollipop release, I read somewhere that Google had contacted the Flappy Bird game developer, may be to buy out Flappy Bird or may be something else who knows. It's a Google product so it was kept secret but not anymore as I found this easter egg the other day. 


http://wakasmalik.blogspot.com/2015/03/flappy-andy.html
Flappy Andy

   It is a flappy bird style game integrated into the new Android Lollipop version but hold on it is hidden, follow these steps on your android device for playing:

  1. Go to your phone settings tab.
  2. Select "About Phone" option.
  3. Scroll down to "Android version" and make sure you have 5.0.1 (Lollipop).
  4. Keep on tapping "Android version" until you see a lollipop appearing on your screen. 
  5. If it is small lollipop tap on it once more to make it bigger with lollipop written in it otherwise you can skip this step.
  6. At this point by every tap this lollipop is going to change its color. 
  7. Now watch this lollipop carefully and notice a smaller circle within the top left corner.
  8. Finally tap and hold into this circle until you see flappy andy game starting up.

It is pretty much similar to flappy bird but much harder, try your luck and don't forget to share your score below in the comments section.


Tuesday, February 17, 2015

Largest Product of Four Numbers in Grid

The other day I came across Project Euler and find it interesting especially it's Problem 11

Problem Statement:

In the 20×20 grid below, four numbers along a diagonal line have been marked in red.

08 02 22 97 38 15 00 40 00 75 04 05 07 78 52 12 50 77 91 08
49 49 99 40 17 81 18 57 60 87 17 40 98 43 69 48 04 56 62 00
81 49 31 73 55 79 14 29 93 71 40 67 53 88 30 03 49 13 36 65
52 70 95 23 04 60 11 42 69 24 68 56 01 32 56 71 37 02 36 91
22 31 16 71 51 67 63 89 41 92 36 54 22 40 40 28 66 33 13 80
24 47 32 60 99 03 45 02 44 75 33 53 78 36 84 20 35 17 12 50
32 98 81 28 64 23 67 10 26 38 40 67 59 54 70 66 18 38 64 70
67 26 20 68 02 62 12 20 95 63 94 39 63 08 40 91 66 49 94 21
24 55 58 05 66 73 99 26 97 17 78 78 96 83 14 88 34 89 63 72
21 36 23 09 75 00 76 44 20 45 35 14 00 61 33 97 34 31 33 95
78 17 53 28 22 75 31 67 15 94 03 80 04 62 16 14 09 53 56 92
16 39 05 42 96 35 31 47 55 58 88 24 00 17 54 24 36 29 85 57
86 56 00 48 35 71 89 07 05 44 44 37 44 60 21 58 51 54 17 58
19 80 81 68 05 94 47 69 28 73 92 13 86 52 17 77 04 89 55 40
04 52 08 83 97 35 99 16 07 97 57 32 16 26 26 79 33 27 98 66
88 36 68 87 57 62 20 72 03 46 33 67 46 55 12 32 63 93 53 69
04 42 16 73 38 25 39 11 24 94 72 18 08 46 29 32 40 62 76 36
20 69 36 41 72 30 23 88 34 62 99 69 82 67 59 85 74 04 36 16
20 73 35 29 78 31 90 01 74 31 49 71 48 86 81 16 23 57 05 54
01 70 54 71 83 51 54 69 16 92 33 48 61 43 52 01 89 19 67 48

The product of these numbers is 26 × 63 × 78 × 14 = 1788696.

What is the greatest product of four adjacent numbers in the same direction (up, down, left, right, or diagonally) in the 20×20 grid?

Solution:

Here is what I come up in two hours , this definitely can be improved more but I am now done, you are welcomed to improve it :-0)

1:  /**  
2:   * Created by Waqas on 1/14/2015.  
3:   */  
4:  public class Problem_Eleven {  
5:    
6:    public static void main(String [] args){  
7:    
8:      int numbersArray [][] = readNumberArray();  
9:      int largestProductOfFourAdjNumbers = 0;  
10:      int actualNumbers[] = new int[4];  
11:      boolean isDiagonal = false;  
12:    
13:      for(int i = 0; i < 20; i++){  
14:        for(int j = 0; j < 17; j++){  
15:          int product = getProductOfFourNumbers(numbersArray[i][j], numbersArray[i][j + 1], numbersArray[i][j + 2], numbersArray[i][j + 3]);  
16:    
17:          if(largestProduct(product, largestProductOfFourAdjNumbers))  
18:          {  
19:            largestProductOfFourAdjNumbers = product;  
20:    
21:            actualNumbers[0] = numbersArray[i][j];  
22:            actualNumbers[1] = numbersArray[i][j + 1];  
23:            actualNumbers[2] = numbersArray[i][j + 2];  
24:            actualNumbers[3] = numbersArray[i][j + 3];  
25:    
26:            isDiagonal = false;  
27:          }  
28:        }  
29:      }  
30:    
31:      for(int i = 0; i < 17; i ++){  
32:        for(int j = 0; j < 20; j++){  
33:          int product = getProductOfFourNumbers(numbersArray[i][j], numbersArray[i + 1][j], numbersArray[i + 2][j], numbersArray[i + 3][j]);  
34:    
35:          if(largestProduct(product, largestProductOfFourAdjNumbers))  
36:          {  
37:            largestProductOfFourAdjNumbers = product;  
38:    
39:            actualNumbers[0] = numbersArray[i][j];  
40:            actualNumbers[1] = numbersArray[i + 1][j];  
41:            actualNumbers[2] = numbersArray[i + 2][j];  
42:            actualNumbers[3] = numbersArray[i + 3][j];  
43:    
44:            isDiagonal = false;  
45:          }  
46:        }  
47:      }  
48:    
49:      for(int i = 0; i < 17; i++){  
50:        for(int j = 0; j < 17; j++){  
51:          int product = getProductOfFourNumbers(numbersArray[i][j],numbersArray[i + 1][j + 1],numbersArray[i + 2][j + 2], numbersArray[i + 3][i + 3]);  
52:    
53:          if(largestProduct(product, largestProductOfFourAdjNumbers))  
54:          {  
55:            largestProductOfFourAdjNumbers = product;  
56:    
57:            actualNumbers[0] = numbersArray[i][j];  
58:            actualNumbers[1] = numbersArray[i + 1][j + 1];  
59:            actualNumbers[2] = numbersArray[i + 2][j + 2];  
60:            actualNumbers[3] = numbersArray[i + 3][i + 3];  
61:    
62:            isDiagonal = true;  
63:          }  
64:        }  
65:      }  
66:    
67:      for(int i = 0; i < 17; i ++){  
68:        for(int j = 3; j < 20; j ++){  
69:          int product = getProductOfFourNumbers(numbersArray[i][j],numbersArray[i + 1][j - 1],numbersArray[i + 2][j - 2],numbersArray[i + 3][j - 3]);  
70:    
71:          if(largestProduct(product, largestProductOfFourAdjNumbers))  
72:          {  
73:            largestProductOfFourAdjNumbers = product;  
74:    
75:            actualNumbers[0] = numbersArray[i][j];  
76:            actualNumbers[1] = numbersArray[i + 1][j - 1];  
77:            actualNumbers[2] = numbersArray[i + 2][j - 2];  
78:            actualNumbers[3] = numbersArray[i + 3][j - 3];  
79:    
80:            isDiagonal = true;  
81:          }  
82:        }  
83:      }  
84:    
85:      System.out.format("Max Product of these %d * %d * %d * %d four Numbers = %d",actualNumbers[0],actualNumbers[1],actualNumbers[2],actualNumbers[3],largestProductOfFourAdjNumbers);  
86:    
87:      if (isDiagonal) {  
88:        System.out.print(". And these numbers are diagonal to each other");  
89:      } else {  
90:        System.out.print(". And these numbers are adjacent to each other");  
91:      }  
92:    }  
93:    
94:    private static int getProductOfFourNumbers(int one, int two, int three, int four){  
95:      return one * two * three * four;  
96:    }  
97:    
98:    private static boolean largestProduct(int product, int largestNumberProduct){  
99:      if(product > largestNumberProduct)  
100:        return true;  
101:      else  
102:        return false;  
103:    }  
104:    
105:    private static int[][] readNumberArray()  
106:    {  
107:      return new int [][] {  
108:          {8,02,22,97,38,15,00,40,00,75,04,05,07,78,52,12,50,77,91,8},  
109:          {49,49,99,40,17,81,18,57,60,87,17,40,98,43,69,48,04,56,62,00},  
110:          {81,49,31,73,55,79,14,29,93,71,40,67,53,88,30,03,49,13,36,65},  
111:          {52,70,95,23,04,60,11,42,69,24,68,56,01,32,56,71,37,02,36,91},  
112:          {22,31,16,71,51,67,63,89,41,92,36,54,22,40,40,28,66,33,13,80},  
113:          {24,47,32,60,99,03,45,02,44,75,33,53,78,36,84,20,35,17,12,50},  
114:          {32,98,81,28,64,23,67,10,26,38,40,67,59,54,70,66,18,38,64,70},  
115:          {67,26,20,68,02,62,12,20,95,63,94,39,63,8,40,91,66,49,94,21},  
116:          {24,55,58,05,66,73,99,26,97,17,78,78,96,83,14,88,34,89,63,72},  
117:          {21,36,23,9,75,00,76,44,20,45,35,14,00,61,33,97,34,31,33,95},  
118:          {78,17,53,28,22,75,31,67,15,94,03,80,04,62,16,14,9,53,56,92},  
119:          {16,39,05,42,96,35,31,47,55,58,88,24,00,17,54,24,36,29,85,57},  
120:          {86,56,00,48,35,71,89,07,05,44,44,37,44,60,21,58,51,54,17,58},  
121:          {19,80,81,68,05,94,47,69,28,73,92,13,86,52,17,77,04,89,55,40},  
122:          {04,52,8,83,97,35,99,16,07,97,57,32,16,26,26,79,33,27,98,66},  
123:          {88,36,68,87,57,62,20,72,03,46,33,67,46,55,12,32,63,93,53,69},  
124:          {04,42,16,73,38,25,39,11,24,94,72,18,8,46,29,32,40,62,76,36},  
125:          {20,69,36,41,72,30,23,88,34,62,99,69,82,67,59,85,74,04,36,16},  
126:          {20,73,35,29,78,31,90,01,74,31,49,71,48,86,81,16,23,57,05,54},  
127:          {01,70,54,71,83,51,54,69,16,92,33,48,61,43,52,01,89,19,67,48}  
128:      };  
129:    
130:    }  
131:  }  
132:    


Any Suggestion, Comments?

Sunday, February 8, 2015

Why is 'x' the unknown?

Since my childhood I was always wondering when, how and why only this x is unknown. Why we always to have to find its value every time ? Why not y, z or any other alphabets? If you are confused to then watch this video may be it will help you also to clear your thoughts as well.

 

 Any thoughts, Comments or Questions?